Точка атрибутов, приписываемых LR, состоит в том, чтобы сделать информацию в левом контексте, доступной для правомерного расширения.
Представьте, что ваша грамматика была
R -> X S Y;
S -> A B;
Вы уже согласились, что S может видеть атрибуты, синтезированные из X. В самом деле, эти атрибуты могут быть доступны по завершении разбора X. Было сделано правильно, эти атрибуты должны быть доступны для A и B по мере их анализа в качестве унаследованных атрибутов из S.
YACC не реализует ничего из этого, насколько мне известно, если вы не хотите считать существование дерева синтаксиса для X как «синтезированный» атрибут разбора X.
Как вы реализуете атрибутивные грамматики, зависит от того, что вы хотите сделать. Основной продукт нашей компании, DMS, сильно использует грамматики атрибутов, без ограничений по направлениям. Мы просто строим полное дерево и распространяем атрибуты по мере необходимости.
Мы делаем предварительные вычисления для каждого типа узлов, набора атрибутов [и их типов], которые он может наследовать, и набора, который он может синтезировать, и синтезировать структуру для каждого. При времени оценки атрибута эти структуры связаны с узлами дерева через хэш-таблицу с очень быстрым доступом. Для каждого типа узла мы проверяем потоки данных (какой ребенок использует тот, который унаследовал атрибут, дети используют синтезированные атрибуты, из которых другие дети). Из этого мы вычисляем порядок выполнения, чтобы вычислить все атрибуты в безопасном (сгенерированном перед потреблением) порядке и создать процедуру для этого для этого типа узла, который вызывает дочерние процедуры. Затем оценка атрибута состоит в вызове сгенерированной процедуры для корня грамматики. (Фактически, мы фактически генерируем частичный заказ для оценки детей и генерируем параллельный вызов частичного порядка с использованием возможностей параллельного языка программирования DMS, обеспечивая быструю оценку с использованием нескольких ядер на очень больших АСТ).
Нет причин, по которым вы не можете ограничить этот процесс атрибутами LR. (Когда-нибудь мы будем нажимать LR-совместимые атрибуты на фазу синтаксического анализа, чтобы позволить их использование в семантических проверках).
Не удивительно, что устройство, которое генерирует процесс оценки атрибутов, само по себе является атрибутором-оценщиком, который работает с грамматиками. Загрузочная игра была немного забавной.
Спасибо, вы говорите, что разница в том, что zyacc разрешает наследование атрибутов, которые были синтезированы до этого, но не обязательно в той же альтернативе, где используются эти атрибуты? – user764754
Ну, * должен * разрешить; Я понятия не имею, что на самом деле делает zyacc. Почему бы вам не попробовать? Если вы пишете что-то, что он не может сделать, если он хорошо разработан, он будет жаловаться. –