Атрибутивная грамматика

Материал из wikixw
Перейти к навигации Перейти к поиску

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

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

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

Атрибутивные грамматики могут также использоваться для перевода синтаксического дерева непосредственно в код для некоторой конкретной машины или на некоторый промежуточный язык.

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

История[править]

Атрибутивные грамматики были изобретены Дональдом Кнутом и Питером Вегнером.[1] в то время как Дональду Кнуту приписывают общую концепцию, Питер Вегнер изобрел унаследованные атрибуты во время разговора с кнутом. Некоторые эмбриональные идеи восходят[1] к работе Эдгара т. "Неда" Айронса, автора IMP.

Пример[править]

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

Expr → Expr + Term
Expr → Term
Term → Term * Factor
Term → Factor
Factor → " ("Expr ")"
Фактор → целое число

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

Expr1 → Expr2 + Термин [ Expr1.значение = Expr2.значение + термин.ценность ]
Expr → Термин [ Expr.значение = срок.ценность ]
Термин1 → Термин2 * Фактор [ Термин1.значение = термин2.значение * фактор.ценность ]
Термин → Фактор [ Термин.значение = фактор.ценность ]
Фактор → "(" Expr") " [ Фактор.значение = Expr.ценность ]
Фактор → целое число [ фактор.value = strToInt (целоечисло .ул) ]

Синтезированные атрибуты[править]

Синтезированный атрибут вычисляется из значений атрибутов дочерних элементов. Поскольку значения дочерних элементов должны быть вычислены в первую очередь, это пример распространения снизу вверх. Чтобы формально определить синтезированный атрибут, пусть G = ⟨ V n , V t , P , S ⟩ }это формальная грамматика, где

   V n  это набор нетерминальных символов
   V t  это набор терминальных символов
   P  П есть множество постановок
   S  С является ли выделенный, или начальный, символ

Затем, заданная строка нетерминальных символов A Одини имя атрибута a один, A . a А. Аявляется синтезированным атрибутом, если выполняются все три из этих условий:

   A → α ∈ P есть это одно из правил грамматики)
   α = α 1 … α n , ∀ i , 1 ≤ i ≤ n : α i ∈ ( V n ∪ V t )  (то есть каждый символ в теле правила является либо нетерминальным, либо терминальным)
   A . a = f ( α j 1 . a 1 , … , α j m . a m ) (т. е. значение атрибута - это функция f  ф, применяемая к некоторым значениям из символов в теле правила)

Унаследованные атрибуты[править]

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

S → ABC

где A может получать значения из S, B и C. B может принимать значения из S, A и C. аналогично, C может принимать значения из S, A и B. Специальные типы атрибутивных грамматик

  • L-атрибутивная грамматика: унаследованные атрибуты могут быть оценены в одном обходе слева направо абстрактного синтаксического дерева
  • LR-атрибутивная грамматика: L-атрибутивная грамматика, унаследованные атрибуты которой также могут быть оценены при анализе снизу вверх.
  • Eclr-атрибутивная грамматика: подмножество LR-атрибутивных Грамматик, в которых классы эквивалентности могут использоваться для оптимизации оценки унаследованных атрибутов.
  • S-атрибутивная грамматика: простой тип атрибутивной грамматики, использующий только синтезированные атрибуты, но не наследуемые атрибуты

См. также[править]

Пруф[править]

wiki.haskell.org/The_Monad.Reader/Issue4/Why_Attribute_Grammars_Matter