Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
13. ТЯП-госы.doc
Скачиваний:
5
Добавлен:
26.08.2019
Размер:
502.27 Кб
Скачать

Наследование атрибутов в стеке синтаксического анализатора

Восходящий синтаксический анализатор сворачивает правую часть продукции А ХY удалением X и Y с вершины стека синтаксического анализатора и заменой их на А. Предположим, что X имеет синтезируемый атрибут Х.s (который хранится в стеке вместе c Х).

Поскольку значение Х.s находится в стеке перед выполнением любой свертки в поддереве ниже Y, это значение может быть наследовано Y. Таким образом, если насле­дуемый атрибут Y.i определен правилом копирования Y.i:=X.s, то значение Х.s может быть использовано там, где требуется Y.i. Правила копирования играют важную роль в вычислении наследуемых атрибутов в процессе восходящего синтаксиче­ского анализа.

Замена наследуемых атрибутов синтезируемыми

Иногда можно избежать использования наследуемых атрибутов путем изменения грамматики.

Например, объявление в PASCAL может состоять из списка идентификаторов, за которым следует тип: m, n: integer;

Грамматика такого объявления может включать продукции вида:

D –> L:T

T –> integer / char

L -> L, id / id

Поскольку идентификаторы порождаются L, но тип в поддереве L не содержится, нельзя связать тип с идентификатором с помощью только синтезируемых атрибутов. Если нетерминал L наследует тип от Т, то получается СУ-определение не являющееся L-атрибутным, так что трансляция на его основе не может быть выполнена в процессе синтаксического анализа.

Решение этой проблемы состоит в реструктуризации грамматики для включения типа в качестве последнего элемента в список идентификаторов.

D –> id L

L -> , id L / : T

T –> integer / char

Теперь тип может рассматриваться как синтезируемый атрибут L.type, и в таблицу символов можно внести тип каждого идентификатора, порождаемого L.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]