Грамматика атрибутов — это формальный способ дополнить формальную грамматику обработкой семантической информации. Семантическая информация хранится в атрибутах, связанных с терминальными и нетерминальными символами грамматики. Значения атрибутов являются результатом правил оценки атрибутов, связанных с постановками грамматики. Атрибуты позволяют передавать информацию из любого места в абстрактном синтаксическом дереве в любое другое место контролируемым и формальным способом. [1]
Каждая семантическая функция имеет дело с атрибутами символов, встречающихся только в одном правиле продукций: как параметры семантической функции, так и ее результат являются атрибутами символов из одного конкретного правила. Когда семантическая функция определяет значение атрибута символа в левой части правила, атрибут называется синтезированным ; в противном случае он называется унаследованным . [2] Таким образом, синтезированные атрибуты служат для передачи семантической информации вверх по дереву разбора, в то время как унаследованные атрибуты позволяют передавать значения из родительских узлов вниз и по всему дереву синтаксиса.
В простых приложениях, таких как оценка арифметических выражений, атрибутная грамматика может использоваться для описания всей задачи, которая должна быть выполнена, помимо разбора простым способом; в сложных системах, например, при построении инструмента перевода языка, такого как компилятор, она может использоваться для проверки семантических проверок, связанных с грамматикой, представляющих правила языка, явно не заданные определением синтаксиса. Она также может использоваться парсерами или компиляторами для перевода синтаксического дерева непосредственно в код для некоторой конкретной машины или на некоторый промежуточный язык .
Атрибутивные грамматики были изобретены Дональдом Кнутом и Питером Вегнером . [3] В то время как Дональду Кнуту приписывают общую концепцию, Питер Вегнер изобрел унаследованные атрибуты во время разговора с Кнутом. Некоторые эмбриональные идеи восходят [3] к работам Эдгара Т. «Неда» Айронса, [4] автора IMP .
Ниже приведена простая контекстно-свободная грамматика , которая может описать язык, состоящий из умножения и сложения целых чисел.
Выражение → Выражение + Термин Выражение → Термин Термин → Термин * Фактор Термин → Фактор Фактор → "(" Выражение ")" Фактор → целое число
Следующая атрибутивная грамматика может быть использована для вычисления результата выражения, записанного в грамматике. Обратите внимание, что эта грамматика использует только синтезированные значения и, следовательно, является S-атрибутированной грамматикой .
Выражение 1 → Выражение 2 + Термин [ Выражение 1 .значение = Выражение 2 .значение + Термин .значение ] Выражение → Термин [ Выражение .значение = Термин .значение ] Термин 1 → Термин 2 * Фактор [ Выражение 1 .значение = Термин 2 .значение * Фактор .значение ] Термин → Фактор [ Выражение .значение = Фактор .значение ] Фактор → "(" Выражение ")" [ Фактор .значение = Выражение .значение ] Фактор → целое число [ Фактор .значение = strToInt( целое число .str) ]
Синтезированный атрибут вычисляется из значений атрибутов дочерних элементов. Поскольку значения дочерних элементов должны быть вычислены первыми, это пример распространения снизу вверх. [5] Чтобы формально определить синтезированный атрибут, пусть будет формальной грамматикой, где
Тогда, если задана строка нетерминальных символов и имя атрибута , то это синтезированный атрибут, если выполняются все три условия:
Унаследованный атрибут в узле в дереве разбора определяется с использованием значений атрибутов в родительском или родственных элементах. Унаследованные атрибуты удобны для выражения зависимости конструкции языка программирования от контекста, в котором она появляется. Например, мы можем использовать унаследованный атрибут для отслеживания того, появляется ли идентификатор слева или справа от назначения, чтобы решить, нужен ли адрес или значение идентификатора. В отличие от синтезированных атрибутов, унаследованные атрибуты могут принимать значения от родительского и/или родственных элементов. Как в следующем произведении,
где A может получать значения из S, B и C. B может принимать значения из S, A и C. Аналогично, C может принимать значения из S, A и B.
{{cite journal}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка ),