ВУЗ:
Составители:
22
При описании синтаксиса языков программирования часто встречаются
правила, которые задают последовательность однотипных конструкций, отде-
ленных друг от друга каким-либо разделителем. Общий вид таких правил:
L→a | a,L или в сокращенной форме L→a{,a}.
Формально здесь не выполняются условия метода рекурсивного спуска,
т.к. две альтернативы начинаются одинаковыми терминальными символами. Но
если принять соглашения, что в подобных ситуациях выбирается самая длинная
подцепочка, выводимая из нетерминала L, то разбор становится детерминиро-
ванным, и метод рекурсивного спуска будет применим к данному правилу
грамматики. Соответствующая правилу процедура будет иметь вид:
procedure L;
begin
if CH<>’a’ then Err else gc;
while CH=’,’ do
begin
gc;
if CH<>’a’ then Err
end
end;
Пример 2.10. Построим синтаксический анализатор методом рекурсив-
ного спуска для модельного языка М.
Вход – файл лексем в числовом представлении.
Выход – заключение о синтаксической правильности программы или со-
общение об имеющихся ошибках.
Введем обозначения:
1) LEX – переменная, содержащая текущую лексему, считанную из файла
лексем;
2) gl – процедура считывания очередной лексемы из файла лексем в пе-
ременную LEX;
2) EQ(S) – логическая функция, проверяющая, является ли текущая лек-
сема LEX лексемой для S;
3) ID – логическая функция, проверяющая, является ли LEX
идентификатором;
4)
NUM - логическая функция, проверяющая, является ли LEX числом.
Процедуры, проверяющие выполнение правил, описывающих язык М и
составляющие синтаксический анализатор, будут иметь следующий вид:
1) для правила Р→ program D1 В.
procedure Р;
begin
if EQ(`program`) then gl else ERR;
D1;
При описании синтаксиса языков программирования часто встречаются правила, которые задают последовательность однотипных конструкций, отде- ленных друг от друга каким-либо разделителем. Общий вид таких правил: L→a | a,L или в сокращенной форме L→a{,a}. Формально здесь не выполняются условия метода рекурсивного спуска, т.к. две альтернативы начинаются одинаковыми терминальными символами. Но если принять соглашения, что в подобных ситуациях выбирается самая длинная подцепочка, выводимая из нетерминала L, то разбор становится детерминиро- ванным, и метод рекурсивного спуска будет применим к данному правилу грамматики. Соответствующая правилу процедура будет иметь вид: procedure L; begin if CH<>’a’ then Err else gc; while CH=’,’ do begin gc; if CH<>’a’ then Err end end; Пример 2.10. Построим синтаксический анализатор методом рекурсив- ного спуска для модельного языка М. Вход – файл лексем в числовом представлении. Выход – заключение о синтаксической правильности программы или со- общение об имеющихся ошибках. Введем обозначения: 1) LEX – переменная, содержащая текущую лексему, считанную из файла лексем; 2) gl – процедура считывания очередной лексемы из файла лексем в пе- ременную LEX; 2) EQ(S) – логическая функция, проверяющая, является ли текущая лек- сема LEX лексемой для S; 3) ID – логическая функция, проверяющая, является ли LEX идентификатором; 4) NUM - логическая функция, проверяющая, является ли LEX числом. Процедуры, проверяющие выполнение правил, описывающих язык М и составляющие синтаксический анализатор, будут иметь следующий вид: 1) для правила Р→ program D1 В. procedure Р; begin if EQ(`program`) then gl else ERR; D1; 22
Страницы
- « первая
- ‹ предыдущая
- …
- 20
- 21
- 22
- 23
- 24
- …
- следующая ›
- последняя »