Основы разработки трансляторов в САПР. Коробова И.Л - 19 стр.

UptoLike

Однако эта лексема может быть также распознана как нетерминальный символ <список перемен-
ных>. Для рассматриваемого метода неважно, какой конкретно нетерминальный символ распознан.
Лексема ид интерпретируется просто как некий нетерминальный символ <N1>. Конструкция
read(<N1>) интерпретируется как один нетерминальный символ <N2>.
На этом разбор предложения read закончено. Если мы сравним деревья грамматического разбора
для этого предложения, то увидим, что они полностью совпадают, за исключением имен нетерминаль-
ных символов.
Рассмотрим грамматический разбор для оператора
; rez: = sum div 100 – А * А ;
< = < > < > < > < >
; rez := <N1> div <N2> – <N4> * <N5> ;
< = < > < >
; rez := <N3> – <N6> ;
< = < >
; rez := <N7> ;
< = >
При этом дерево грамматического разбора имеет вид, представленный на рис. 9.
Заметим еще раз, что процесс грамматического разбора начинается слева направо и продолжается
на каждом шаге до тех пор, пока не определится очередной фрагмент предложения для грамматическо-
го распознавания, т.е. первый фрагмент, ограниченный отношениями <• и •>. Как только подобный
фрагмент выделен, он интерпретируется как некоторый очередной нетерминальный символ в соответ-
ствии с каким-нибудь правилом грамматики. Этот процесс продолжается до тех пор, пока предложение
не будет распознано целиком.
<N3>
<N1>
div
<N2> <N4> * <N5>
ид1 := ид2 конст ид3 ид4
rez sum 100 a a
<N6>
<N7>
<N8>
Рис. 9
Обратите внимание, что каждый фрагмент дерева грамматического разбора строится, начиная с ко-
нечных узлов вверх, в сторону корня дерева. Отсюда и возник термин восходящий разбор. Если мы рас-
смотрим дерево грамматического разбора, исходя из грамматики языка (рис. 8), то увидим, что оно не-
сколько отличается от полученного методом операторного предшествования дерева (рис. 9).
Например, идентификатор sum был сначала интерпретирован как <значение>, а потом как <слагае-
мое>, являющийся одним из операндов операции div. При разборе методом операторного предшество-
вания идентификатор sum был интерпретирован как единственный нетерминал <N1>, который является
операндом операции div. Таким образом, <N1> соответствует двум нетерминальным символам <значе-
ние> и <слагаемое>. Имеются и другие подобные различия.
Они вытекают из свободы образования имен нетерминальных символов, распознаваемых в рамках
метода операторного предшествования. Интерпретация sum сначала как <значение>, а потом как <сла-
гаемое> является просто переименованием нетерминальных символов. Такое переименование необхо-