Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
175
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

7.4.3 Использование отношений приоритетов операторов

Цель отношений приоритетов состоит в определении границ основы правосентенциальной формы: <• отмечает ее левый конец, •> — правый, а находится внутри основы. Предположим, что есть правосентенциальная форма операторной грамматики. Из того, что у продукции не может быть двух смежных нетерминалов в правой части, следует, что и правосентенциальная форма не может иметь двух смежных нетерминалов. Таким образом, правосентенциальную форму можно записать в виде β0a1β1... anβn, где каждое β является либо пустой строкой, либо одиночным нетерминалом, а каждое а, представляет собой одиночный терминал.

Предположим, что между аi и аi+1 выполняется ровно одно отношение — •>, <•, . Используем для маркировки концов строки символ $ и определим, что $<• b и b для всех терминалов b. Теперь предположим, что из строки удалили нетерминалы и поместили одно из отношений •>, <• или между каждой парой терминалов и между крайними терминалами и маркерами $. В правосентенциальная форме id + id * id отношения приоритетов показаны в таблице рис. 33 (эти отношения выбраны при рассмотрении грамматики из примера 22).

Id

+

*

$

id

•>

•>

•>

+

<•

•>

<•

•>

*

<•

•>

•>

•>

$

<•

<•

<•

Рис. 33. Отношения приоритетов операторов

Тогда строка с отношениями приоритетов принимает вид

$ <id •> + <• id •> * <• id •> $ (7.1)

Например, <• вставлен между крайним слева $ и id, поскольку в ячейке в строке и столбце id находится отношение <•. Основа может быть найдена следующим образом:

1. Сканируем строку слева направо, пока не встретим первый символ •>. В (7.1): символ располагается между первым id и +.

2. Затем сканируем строку в обратном направлении (влево), пропуская все , пока не встретим <•. В (7.1) сканирование идет до символа $.

3. Основа содержит все, что находится слева от первого •> и справа от <•, найденного на шаге (2), включая все промежуточные и окружающие нетерминалы (включение окружающих нетерминалов необходимо для того, чтобы в правосентенциальной форме не появлялись два смежных нетерминала). В (7.1) основой является первый id.

Работая с грамматикой (7.1) свертываем id в E, в результате чего получаем правовосентенциальную форму E+id*id. После свертки двух оставшихся id в E получаем правосентенциальную форму E+E*E. Следующая строка $+*$ получена удалением нетерминалов. Вставка отношений приоритетов дает строку $<•+<• * •>$, из которой ясно, что левый конец основы находится между + и *, а правый — между * и $. Эти отношения приоритетов указывают, что в правосентенциальной форме E+E*E основой является E*E. Окружающие * нетерминалы E также являются частью основы.

Поскольку нетерминалы не влияют на процесс анализа, можно не беспокоиться об их распознавании. В стеке синтаксического анализатора приоритета операторов дос­таточно одного маркера "нетерминал", чтобы обозначать места для хранения значений атрибутов.

Если меж­ду терминалом на вершине стека и очередным входным символом выполняется отноше­ние <• или , то синтаксический анализатор выполняет перенос (это означает, что пра­вый конец основы еще не найден). Если отношение — •>, то выполняется свертка. В этот момент синтаксический анализатор обнаружил правый конец основы, и для поиска ее левого конца в стеке можно воспользоваться отношениями приоритета.

Если между парами терминалов не выполняется ни одно из отношений приоритетов (пустые ячейки в таблице на рис. 33), то обнаружена синтаксиче­ская ошибка, и должна быть вызвана программа восстановления после ошибки.