Грамматика атрибутов - Attribute grammar

Грамматика атрибута является формальным способом дополнить формальную грамматику с обработкой семантической информации. Семантическая информация хранится в атрибутах, связанных с терминальными и нетерминальными символами грамматики. Значения атрибутов являются результатом правил оценки атрибутов, связанных с производством грамматики. Атрибуты позволяют передавать информацию из любого места абстрактного синтаксического дерева в другое место контролируемым и формальным способом.

Каждая семантическая функция имеет дело с атрибутами символов, встречающимися только в одном производственном правиле: и параметры семантической функции, и ее результат являются атрибутами символов из одного конкретного правила. Когда семантическая функция определяет значение атрибута символа в левой части правила, атрибут называется синтезированным ; в противном случае он называется унаследованным . Таким образом, синтезированные атрибуты служат для передачи семантической информации вверх по дереву синтаксического анализа, в то время как унаследованные атрибуты позволяют передавать значения от родительских узлов вниз и через дерево синтаксиса.

В простых приложениях, таких как оценка арифметических выражений, грамматика атрибутов может использоваться для описания всей задачи, которая должна быть выполнена, помимо простого анализа; в сложных системах, например, при создании средства языкового перевода, такого как компилятор, его можно использовать для проверки семантических проверок, связанных с грамматикой, представляющих правила языка, не переданные явным образом определением синтаксиса. Он также может использоваться синтаксическими анализаторами или компиляторами для перевода синтаксического дерева непосредственно в код для некоторой конкретной машины или на некоторый промежуточный язык .

История

Грамматики атрибутов были изобретены Дональдом Кнутом и Питером Вегнером . В то время как Дональд Кнут считается автором общей концепции, Питер Вегнер изобрел унаследованные атрибуты во время разговора с Кнутом. Некоторые зародышевые идеи восходят к работе Эдгара Т. «Неда» Айронса, автора IMP .

Пример

Ниже приводится простая контекстно-свободная грамматика, которая может описывать язык, состоящий из умножения и сложения целых чисел.

 ExprExpr + Term
 ExprTerm
 TermTerm * Factor
 TermFactor
 Factor → "(" Expr ")"
 Factorinteger

Следующая грамматика атрибутов может использоваться для вычисления результата выражения, записанного в грамматике. Обратите внимание, что эта грамматика использует только синтезированные значения и, следовательно, является грамматикой с S-атрибутами .

 Expr1Expr2 + Term [ Expr1.value = Expr2.value + Term.value ]
 ExprTerm [ Expr.value = Term.value ]
 Term1Term2 * Factor [ Term1.value = Term2.value * Factor.value ]
 TermFactor [ Term.value = Factor.value ]
 Factor → "(" Expr ")" [ Factor.value =  Expr.value ]
 Factorinteger [ Factor.value = strToInt(integer.str) ]

Синтезированные атрибуты

Синтезированный атрибут вычисляется из значений атрибутов дочерних элементов. Поскольку сначала необходимо вычислить значения дочерних элементов, это пример восходящего распространения. Чтобы формально определить синтезируемый атрибут, пусть будет формальная грамматика, где

  • это набор нетерминальных символов
  • это набор терминальных символов
  • это множество постановок
  • это выделенный или начальный символ

Затем, учитывая строку нетерминальных символов и имя атрибута , это синтезированный атрибут, если выполняются все три из этих условий:

  • (т.е. это одно из правил грамматики)
  • (т.е. каждый символ в теле правила является либо нетерминальным, либо терминальным)
  • , где (т.е. значение атрибута - это функция, применяемая к некоторым значениям из символов в теле правила)

Унаследованные атрибуты

Унаследовал атрибут в узле в дереве разбора определяется с помощью значения атрибутов на родителей или братьев и сестер. Унаследованные атрибуты удобны для выражения зависимости конструкции языка программирования от контекста, в котором она появляется. Например, мы можем использовать унаследованный атрибут, чтобы отслеживать, появляется ли идентификатор слева или справа от назначения, чтобы решить, нужен ли адрес или значение идентификатора. В отличие от синтезированных атрибутов, унаследованные атрибуты могут принимать значения от родителей и / или братьев и сестер. Как и в следующей постановке,

S → ABC

где A может получать значения из S, B и C. B может принимать значения из S, A и C. Точно так же C может принимать значения из S, A и B.

Специальные типы грамматик атрибутов

Смотрите также

использованная литература

внешние ссылки