ВУЗ:
Составители:
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
- …
- следующая ›
- последняя »
