- •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. Атрибутные транслирующие грамматики
В основе методов перевода, описываемых в данном учебном пособии, лежат концепции транслирующей грамматики и атрибутной транслирующей грамматики.
3.1. Транслирующие грамматики
Транслирующая грамматика – это КС-грамматика, множество терминалов которой разбито на множество входных и множество операционных символов.
Определение. Транслирующей грамматикой называется пятерка объектов GT = < Ti , Ta, N, S, R >, где Ti – словарь входных символов, Ta – словарь операционных символов, N – нетерминальный словарь, S N –начальный символ транслирующей грамматики, R – конечное множество правил вывода вида A . Здесь A N, (Ti U Ta U N)*.
Для того чтобы операционные символы отличались от входных и нетерминальных символов, операционные символы будем записывать в фигурных скобках { и }.
Транслирующая грамматика G0T, описывающая перевод инфиксных арифметических выражений в ПОЛИЗ, приведена на рис. 3.1, а.
E E + T {+} (1) E E + T
E T (2) E T
T T P {} (3) T T P
T P (4) T P
P (E) (5) P (E)
P i { i ) (6) P i
а б
Рис. 3.1
Определение. Грамматика, полученная из транслирующей грамматики путем вычеркивания всех операционных символов, называется входной грамматикой для этой транслирующей грамматики. Язык, порождаемый входной грамматикой, называется входным языком.
Например, входной грамматикой G0 для транслирующей грамматики G0T является КС-грамматика для инфиксных арифметических выражений, приведенная на рис.3.1, б.
Рассмотрим левый вывод цепочки i + i i во входной грамматике G0.
E E + T T + T P + T i + T i + T P i + P P i + i P i + i i
Применив эту же последовательность правил к соответствующим нетерминалам транслирующей грамматики G0T, получим следующий левый вывод:
E E + T {+} T + T {+} P + T {+} i { i } + T {+} i { i } + T P {} {+} i { i } + P P {} {+} i { i } + i { i } P {} {+} i { i } + i { i } i { i } {} {+}
Цепочки языка, порождаемого транслирующей грамматикой, называют активными цепочками. Входной частью активной цепочки называется последовательность входных символов, полученная из активной цепочки после удаления всех операционных символов. Операционной частью активной цепочки называется последовательность операционных символов, полученная путем вычеркивания из активной цепочки всех входных символов.
Например, последовательность i + i i является входной частью активной цепочки i { i } + i { i } i { i } { } { + }, a последовательность
{ i } { i } { i }{ } { + } – ее операционной частью.
Определение. Множество всех пар, первыми элементами которых являются входные части активной цепочки, а вторыми элементами –операционные части активной цепочки, называется синтаксически управляемым переводом (GT), определяемым транслирующей грамматикой GТ.
В восходящих методах обработки языков широко применяются постфиксные транслирующие грамматики.
Определение. Транслирующая грамматика называется постфиксной транслирующей грамматикой тогда и только тогда, когда все операционные символы в правых частях правил вывода расположены правее всех входных и нетерминальных символов.
Примером постфиксной транслирующей грамматики является грамматика GT0.
Для получения транслирующей грамматики входной язык описывается входной КС-грамматикой. Затем в правила вывода этой грамматики вставляются операционные символы для описания семантических действий, связанных с соответствующими правилами.
Рассмотрим получение транслирующей грамматики G0T по входной грамматике G0. В ПОЛИЗ операнды располагаются в той же последовательности, что и в инфиксной записи, а знаки операций следуют непосредственно после своих операндов в том порядке, в котором они выполняются. Для того чтобы идентификатор i выдавался сразу после его прочтения, правило (6) преобразуется к виду P i { i }. Чтобы знак операции сложения выдавался непосредственно после своих операндов, правило (1) заменяется на Е E + T {+}. Это правило интерпретируется следующим образом: обработка арифметического выражения Е состоит из обработки первого операнда (Е), чтения символа “+”, обработки второго операнда (Т) и выдачи символа “+”. Аналогичные рассуждения позволяют следующим образом преобразовать правило (3):
Т T P {}.
Один и тот же перевод можно определить разными транслирующими грамматиками. Например, две транслирующие грамматики G1T и G2T, определяющие перевод в ПОЛИЗ инфиксных бесскобочных арифметических выражений, выполняемых в порядке написания операций, приведены соответственно на рис. 3.2, а и 3.2, б.
(1) E E + T {+} (1) E i { i } R
(2) E T P {} (2) R + i { i } {+} R
E T (3) R i { i } { } R
Т i (4) R
а б
Рис. 3.2
Во многих практических приложениях вхождение входного символа в активную цепочку можно интерпретировать как обозначение операции чтения этого символа некоторым устройством, а вхождению операционного символа в правило вывода можно сопоставить операцию выдачи символа, заключенного в фигурные скобки. При таком подходе входную часть активной цепочки называют входной цепочкой, операционную часть –выходной цепочкой, а транслирующую грамматику, определяющую перевод, – грамматикой цепочечного перевода.
Примером грамматики цепочечного перевода является грамматика G0T, приведенная на рис. 3.1, а.
Другая возможная интерпретация операционных символов – имена семантических процедур, вызываемых при обработке входной цепочки. В этом случае активная цепочка определяет последовательность вызовов семантических процедур и моменты времени, в которые выполняются эти вызовы по отношению к моментам чтения входных символов.