Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
175
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

9.9 Схемы трансляции

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

Схема трансляции – это контекстно-свободная грамматика, в ко­торой атрибуты, связанные с символами грамматики, и семантические действия за­ключены в фигурные скобки ( { } ) и вставлены в правые части продукций. Схемы трансляции являются удобным способом записи определения трансляции, выполняемой в процессе син­таксического анализа.

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

Пример 38

Схема трансляции, преобразующая инфиксные выражения со сложением и вычитанием в соответствующие постфиксные выражения.

E TR

R addop T{print (addop.lexeme)}R1 | λ

T num{print(num.val)}

На рис. 59 показано дерево разбора для входной строки 9-5+2, на котором семан­тические действия показаны как дочерние узлы по отношению к узлам, представляющим левые части соответствующих продукций. По сути, действия рассматриваются как тер­минальные символы, что удобно для определения момента выполнения этих действий. Вместо лексем num и addop указываются реальные числа и операция сложения. При выполнении действий в порядке обхода в глубину действия на рис. 59 приводят к вы­воду 95-2 + .

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

Рис. 59. Дерево разбора с семантическими действиями

для выражения 9-5+2

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

Т T1 * F и семантическое правило T1.vа1 := T1val ×F.val дают следующую продукцию и семантическое действие.

T T1* F { T.vаl := T1.val × F.val}

Если имеются и синтезируемые, и наследуемые атрибуты, необходимо соблюдать следующие правила.

1. Наследуемый атрибут для символа из правой части продукции должен вычисляться в действии перед этим символом.

2. Действие не должно обращаться к синтезируемому атрибуту символа справа от действия.

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

Например, следующая схема трансляции не удовлетворяет первому из трех требований.

S A1А2 { А1.iп := 1; А2.iп := 2 }

А а {print(А. in)}

При попытке вывести его значение в процессе обхода в глубину дерева разбора входной строки аа наследуемый атрибут А.in во второй продукции не определен Обход в глубину начинается в S и проходит поддеревья A1 и А2 до того, как устанавлива­ются значения A1.iп и А2.in. Если действие, определяющее значения A1 .iп и A2 .iп, вставить перед символами А в правой части продукции S—> A1 А2, то А.in будет определено при каждом вызове print(А. in).

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