11.6. РЕКУРСИЯ В ТРАНСЛИРУЮЩИХ ПРОГРАММАХ
695
В соответствии с новой грамматикой процесс распознавания того, явля-
ется ли входная строка выражением, задается с помощью комплекта логиче-
ских функций:
E
,
M
,
T
и
I
. Они выясняют, распознается ли некоторая часть
строки как выражение (
E
), простое выражение (
M
), терм (
T
) и имя перемен-
ной (
I
), и тогда вырабатывают значение true, а в противном случае — false.
Для наглядности программы этих функций поименованы также, как прави-
ла грамматики. Они составляются систематическим переписыванием пра-
вил, при котором понятия, появляющиеся в правиле, превращаются в вызовы
соответствующих им функций, а обрамленные фигурными скобками части
оформляются как циклы.
Обработка символов, из которых строится выражение (букв, знаков “+”,
“-”, “*”, “/”, скобок), задается как сравнение этих символов с значением ли-
теры из входного потока. Это значение поставляется специальной процеду-
рой
Scan
, которая записывает его в глобальную переменную
S
. В предста-
вленной ниже программе
Scan
осуществляет чтение литеры из файла вво-
да и печатает пробел под очередным читаемым символом (чтобы в случае
ошибки можно было бы отметить этот символ в вводимой строке). Как пра-
вило, подобные действия сопровождаются другими дополнительными вычи-
слениями лексического характера,например,распечаткой читаемой последо-
вательности символов, удалением незначащих пробелов и др. Тем самым в
программе синтаксического анализа выделяется часть, отвечающая за прове-
дение лексических вычислений, главная цель которых — выработка лексем
(в предлагаемой программе это значения переменной
S
), передаваемых для
выполнения собственно синтаксических вычислений без избыточной инфор-
мации. Обучаемому предлагается модифицировать программу с тем, чтобы
указанные выше дополнительные лексические вычисления осуществлялись.
Переменная
S
и процедура
Scan
включены в комплект подпрограмм син-
таксического распознавания.
Последнее предварительное замечания касается использования в програм-
ме конструкции #13 языка
Turbo Pascal
. Она обозначает символьное значе-
ние, которое нельзя представить графически, в данном случае это символ пе-
рехода на новую строку, который позволяет узнавать, действительно ли вся
входная последовательность прочитана.
Программа 11.6.1
program PARSER;
var S : Char;