stringtranslate.com

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

Грамматика атрибутов — это формальный способ дополнить формальную грамматику обработкой семантической информации. Семантическая информация хранится в атрибутах, связанных с терминальными и нетерминальными символами грамматики. Значения атрибутов являются результатом правил оценки атрибутов, связанных с постановками грамматики. Атрибуты позволяют передавать информацию из любого места в абстрактном синтаксическом дереве в любое другое место контролируемым и формальным способом. [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.

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

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

Ссылки

  1. Кнут 1968, стр. 134.
  2. Кнут 1968, стр. 132.
  3. ^ ab DE Knuth: Генезис атрибутных грамматик. Труды международной конференции по атрибутным грамматикам и их приложениям (1990), LNCS, т. 461, 1–12.
  4. ^ "Главное".
  5. Кнут 1968, стр. 130.

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