Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГЭ-2013-анн-130515.doc
Скачиваний:
5
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

7.9. Метод рекурсивного спуска построения синтаксического анализатора

Метод рекурсивного спуска состоит в том, что для каждого нетерминала КС-грамматики строится процедура на языке программирования, используемом для написания компилятора. КС-грамматика должна быть разделенной. Процедура считывает ту часть входной цепочки, которая выводится из этого нетерминала. При этом используются процедуры тех нетерминалов, которые встречаются в правых части. Альтернативы различаются по первым терминальным символам. Например, для нетерминала, имеющего правила

u 0 x y | 1 z,

процедура на Паскале может быть такой:

Procedure u;

Var c: char;

Begin

getsym(c); (* выбрать очередную лексему *)

Case c Of

’0’: Begin getsym; x; y End;

’1’; Begin getsym; z End

End {Case}

End; {Procedure u}

Метод часто используется в программах автоматического построения анализаторов.

[M] гл.2. [Х] 4.4.

[K] 5.10

[С] с.277-278.

7.10. Способы описания синтаксиса языков программирования. Диаграммы Вирта, расширенная форма Бэкуса-Наура

Обычный способ описания синтаксиса языка программирования – формы Бэкуса-Наура, например:

<программа> ::= begin <последовательность операторов> end

<последовательность операторов> ::= <оператор>

<последовательность операторов> ::= <оператор> ; <последовательность операторов>

Расширенная форма Бэкуса-Наура (РБНФ) – формальная система описания синтаксиса, в которой одни синтаксические категории последовательно определяются через другие категории. В правых частях могут использоваться регулярные выражения, а также специальные конструкции:

A B – за A следует B;

A | B – A или B (но не одновременно);

[A] – выражение может быть пропущено;

{A} – последовательность из нуля или более выражения A;

Существует и другие формы, эквивалентные РБНФ:

A B – за A следует B;

A | B – A или B (но не одновременно);

A? – выражение может быть пропущено;

A+ – последовательность из одного или более выражения A;

A* – последовательность из нуля или более выражения A;

A - B – строка, соответствующая выражению A, но не B;

[a-zA-Z] – символ из интервала;

[^a-z] – любой символ кроме интервала;

[abc] – символ из перечисленных;

[^abc] – любой символ, кроме перечисленных.

Здесь вместо {A} используется запись A*, . вместо [A] – A?. Выражение [0-3] эквивалентно 0|1|2|3. Другие формы также могут быть выражены через базовые формулы.

Регулярные языки могут быть описаны не только регулярными выражениями, но и диаграммами эквивалентного конечного автомата. Такое графическое описание более наглядно.

Графическим описанием КС-языков являются диаграммы Вирта, которые представляют собой графы, строящиеся для каждого нетерминала. В вершинах графа, представленных прямоугольниками с закругленными углами, записаны терминальные символы, в прямоугольниках – нетерминальные. Дуги графа указывают последовательность символов. Такие диаграммы называются синтаксическими.

Аналогичным инструментом описания является КС-диаграммер ([АУ], гл. 5). Помимо графического описания, похожим на диаграммы Вирта, диаграммер позволяет строго определить алгоритм синтаксического анализа.

[АУ] 3.3.

[K] 2.7