Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка целая.docx
Скачиваний:
82
Добавлен:
12.11.2019
Размер:
5.04 Mб
Скачать

§ 5. Грамматики операторного предшествования

Важное подмножество КСГ содержит к себе так на­зываемые операторные грамматики. Это грамматики, в которых все продукции такие, что никакие два нетер­минала не являются смежными в любой правой части, и, следовательно, лежащий между ними терминал можно представить как оператор (хотя не обязательно в ариф­метическом смысле). Попытаемся определить отношения предшествования на множестве , где├ и ┤ суть новые символы, которых нет в и которые ограни­чивают «предложение». Правила определим следующим образом:

  1. , если ; здесь , и

  2. если ; здесь и .

  3. если ; здесь и

  4. , если ,

  5. , если ,

Символы , и обозначают отношения предше­ствования (читается как «имеет меньшее старшинство, чем», «имеет такое же старшинство, как», «имеет боль­шее старшинство, чем»); при условии но не более од­ного такого отношения справедливо между двумя произ­вольными операторами из , соответствующую операторную грамматику называют грамматикой операторного предшествования.

Хотя она и является гораздо более сложной, чем дру­гие виды грамматик, встречавшихся до сих пор, понятие предшествования может быть введено так, что будет совпадать с обычным старшинством арифметических опе­раторов и будет расширено до операторов, действия кото­рых важны с точки зрения вычислений, однако обычно считаются само собой разумеющимися при вычислениях «на бумаге».

П р и м е р 5.1.

Для этой грамматики отношения предшествования при­ведены в виде таблицы на рис. 8.13. //

Р ис. 8.13

Для того чтобы увидеть, что происходит в действи­тельности, рассмотрим этап внутри вывода предложения . Из правила 2 определений предшество­вания видно, что для символов и ( имеем

,

Таким образом, выполняется отношение (, и поэто­му поддерево должно быть вычислено перед вычисле­нием ; следовательно, действие, связанное с «(», ко­торым является удаление этой и парной к пей закры­вающей скобки, выполняется перед действием, обозна­ченным « ». (Графически ситуацию можно представить так, как это сделано на рис. 8.14. Здесь для правила 2 имеем , , , , , b ≡ ( и . Отсюда видно, что основная структура грамматик операторного предшествования является простой и есте­ственной, однако выглядит сложной при записи из-за общности правил.) Заменяя целыми числами 2, 3 и 4,

получаем Записывая отношения предше­ствования под этим выражением, видим, как определя­ется порядок вычислений

;

:

а) выберем число 2 и сохраним его в стеке:

б) аналогично удалим 3 из выражения и поместим в стек:

в) с 4 поступим подобным образом:

г) выполним сложение двух верхних элементов в сте­ке и результат оставим там же; удалим символ +:

д) отбросим скобки:

е) произведем умножение двух верхних элементов стека, оставляя результат в стеке; удалим символ

;

ж) останов из-за отсутствия отношений предшество­вания; ответ находится в стеке.

Конечно, вместо выполнения арифметических опера­ций мы могли бы породить код и после этого вычислить выражение — это как раз то, что сделал бы компилятор.

У п р а ж н е н и е 8.5.

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

.