- •3. Атрибутные транслирующие грамматики
- •3.1. Транслирующие грамматики
- •3.2. Атрибутные транслирующие грамматики
- •3.2.1. Синтезированные атрибуты
- •Рис 3.4
- •3.2.2. Унаследованные атрибуты
- •3.2.3. Определение атрибутной транслирующей грамматики
- •P2 p1
- •3.2.4. L- и s-атрибутные транслирующие грамматики
- •3.2.5. Форма простого присваивания
3.2. Атрибутные транслирующие грамматики
При определении транслирующей грамматики в понятие входного символа не включалось представление о том, что он является лексемой и состоит из двух компонентов: типа и значения. На самом деле транслирующая грамматика способна описывать перевод только той части символа, которая задает его тип. Рассмотрим, как можно расширить понятие грамматики цепочечного перевода, чтобы использовать при переводе оба компонента входного символа. Расширенная транслирующая грамматика получила название атрибутной транслирующей грамматики (АТ-грамматики). АТ-грамматики были предложены Д. Кнутом [6] и в дальнейшем изучались рядом ученых. Материал данного подраздела в основном базируется на результатах, приведенных в [5], [7].
В АТ-грамматике символы снабжаются атрибутами, которые могут принимать значения из некоторого множества допустимых значений и интерпретируются как семантическая информация, связанная с конкретным вхождением символа в правило вывода грамматики. При таком подходе значения атрибутов связываются с вершинами дерева вывода в АТ-грамматике, а правила вычисления значений атрибутов сопоставляются правилам вывода грамматики.
Все атрибуты нетерминальных и операционных символов делятся на синтезированные и унаследованные.
3.2.1. Синтезированные атрибуты
Рассмотрим получение АТ-грамматики из исходной транслирующей грамматики. Пусть задана транслирующая грамматика G3T (рис. 3.3), допускающая в качестве входа арифметические выражения, построенные из символов множества {с, +, , (, )}, где с – лексема, являющаяся целочисленной константой, и порождающая на выходе значение этого выражения. На рис. 3.4, а изображено дерево вывода для входной цепочки с5 + с2 с8 (индексы обозначают значения лексем). Этой входной цепочке должна соответствовать выходная цепочка {ОТВЕТ}21. Поскольку любое вхождение нетерминала Е, Т или Р в дерево вывода представляет собой некоторое подвыражение входного выражения, введем для каждого из символов Е, Т и Р по одному атрибуту, значением которого будет значение подвыражения, порождаемого этим нетерминалом. Входной символ с и операционный символ
S E {ОТВЕТ}
E E + T
E T
Т T P
T P
P ( E )
P c
Рис. 3.3
S
а б
Рис 3.4
символ {ОТВЕТ} также имеют по одному атрибуту. Значение атрибута символа с равно значению константы, которую он представляет, а значением символа {ОТВЕТ} является результат выражения. Все атрибуты символов могут принимать любые целочисленные значения из области допустимых для выражений, описываемых соответствующей входной грамматикой G3. На рис. 3.4, б изображено дерево вывода той же цепочки, что и на рис. 3.4, а, но на этом дереве нетерминалы и операционный символ {ОТВЕТ} помечены значениями своих атрибутов.
Выберем для каждого атрибута каждого вхождения символа в правило вывода грамматики уникальное имя и включим атрибуты в правила вывода в виде подстрочных индексов соответствующих символов. Заметим, что одни и те же имена атрибутов можно использовать в нескольких правилах. Сопоставим каждому правилу вывода грамматики правило вычисления значения атрибута нетерминала из левой части правила, которому соответствует нетерминальная вершина дерева вывода. Рассмотрим, например, вершину Т дерева, изображенного на рис. 3.4, а. Правило вывода, примененное к этой вершине, имеет вид: Т Т Р. Оно определяет, что значение подвыражения, порожденного нетерминалом из левой части правила, равно значению подвыражений, порожденных символами Р и Т из правой части правила, которые являются прямыми потомками вершины Т. Если р – атрибут символа Т из левой части правила, а q и r – атрибуты символов Т и Р из правой части правила, то правило вычисления значения атрибута р будет иметь вид: p q r, где символ “” – знак операции присваивания. Таким образом, начиная с атрибутов входных символов и поднимаясь по дереву от кроны к корню, можно определить все значения атрибутов нетерминалов из левых частей правил вывода. Правила вычисления значений атрибутов для АТ-грамматики G3А, полученной по транслирующей грамматике G3T, приведены на рис. 3.5.
Атрибуты, значения которых вычисляются при движении по дереву вывода снизу вверх, традиционно называют синтезированными. Термин "синтезированный" подчеркивает, что значение атрибута синтезируется из значений атрибутов потомков.
S Eq {ОТВЕТ}r
r q
Ep Eq + Tr
p q + r
Ep Tq
p q
Еp Tq Pr
p q r
Tp Pq
p q
Pp ( Eq )
p q
Pp cq
p q
Рис. 3.5
Рассмотренные выше правила вычисления значений атрибутов не распространяются на атрибут операционного символа {ОТВЕТ}, который относится к классу унаследованных атрибутов.