Введение

Атрибутная грамматика – это формальный способ дополнения формальной грамматики обработкой семантической информации. Семантическая информация хранится в атрибутах, связанных с терминальными и нетерминальными символами грамматики. Значения атрибутов являются результатом применения правил вычисления атрибутов, связанных с продукциями грамматики. Атрибуты обеспечивают передачу информации из любой точки абстрактного синтаксического дерева в любую другую, контролируемым и формальным образом. Каждая семантическая функция оперирует атрибутами символов, встречающихся только в одном продукционном правиле: как параметры семантической функции, так и её результат являются атрибутами символов из одного конкретного правила. Если семантическая функция определяет значение атрибута символа, находящегося в левой части правила, этот атрибут называется синтезированным; в противном случае он называется унаследованным. Таким образом, синтезированные атрибуты служат для передачи семантической информации вверх по дереву разбора, а унаследованные атрибуты позволяют передавать значения от родительских узлов вниз и по дереву синтаксического анализа. В простых приложениях, таких как вычисление арифметических выражений, атрибутная грамматика может использоваться для описания всей задачи, которую необходимо выполнить, помимо синтаксического анализа, простым способом. В сложных системах, например, при создании инструмента для преобразования языка, такого как компилятор, она может использоваться для проверки семантических ограничений, связанных с грамматикой, представляющих правила языка, неявно заданные в определении синтаксиса. Она также может использоваться парсерами или компиляторами для непосредственного преобразования синтаксического дерева в код для конкретной машины или в промежуточный язык.

История

Атрибутные грамматики были изобретены Дональдом Кнутом и Питером Вегнером. Хотя Дональду Кнуту приписывают общую концепцию, Питер Вегнер изобрел наследуемые атрибуты в ходе беседы с Кнутом. Некоторые ранние идеи прослеживаются к автору IMP.