Разработка компиляторов. Ишакова Е.Н. - 31 стр.

UptoLike

Составители: 

31
Синтаксически управляемый перевод
На практике СиА, СеА и генерация внутреннего представления програм-
мы осуществляется часто одновременно. Способ построения промежуточной
программысинтаксически управляемый перевод. В его основе лежит грамма-
тика с действиями. Параллельно с анализом исходной цепочки лексем осущест-
вляются действия по генерации внутреннего представления программы. Для
этого грамматика дополняется вызовами соответствующих процедур.
Пример 2.17. Составим процедуры перевода в ПОЛИЗ программы на М
языке.
ПОЛИЗ представляет собой массив, каждый элемент которого является
парой вида (
n, k), где nномер таблицы лексем, kномер лексемы в таблице.
Расширяем набор лексем:
1) в таблицу ограничителей добавляем новые операции ! (18), !
F (19),
R (20), W (21);
2) для ссылок на номера элементов ПОЛИЗа введем нулевую таблицу
лексем, т.е. пара (0,
p) - это лексема, обозначающая p-ый элемент в ПОЛИЗе;
3) чтобы различать операнды-переменные и операнды-адреса перемен-
ных, обозначим переменные как четвертую таблицу лексем, а адресапятую.
Введем следующие обозначения переменных и процедур:
1)
Рпеременнаямассив, в который размещается генерируемая про-
грамма;
2)
freeпеременная, хранящая номер первого свободного элемента в
массиве
P;
3)
LEXпеременная, хранящая очередную лексему;
4)
put_lex(LEX) – запись очередной лексемы в массив P, т.е. P[free]:=LEX
и
free:=free+1;
5)
put_lзапись текущей лексемы в массив P;
6)
put_l5запись текущей лексемы в массив P с изменением четвертого
класса лексем на пятый;
7)
put_op - запись в массив P знака операции, считанного процедурой
checkop;
8)
make(k) - процедура, формирующая лексему-метку (0, k).
Правила, описывающие выражения языка М, с учетом действий перевода
в ПОЛИЗ принимают вид.
Е Е1 {( > | < | = ) <instl> E1 <checkop; put_op >}
E1 Т {(+ | - | ) <instl> T <checkop; put_op >}
T
F {( * | / | ) <instl> F<checkop; put_op >}
F I <checkid; put_l> | N <inst(‘int’); put_l> | L <inst(‘bool’); put_l>|
¬F <checknot
; put_lex(‘¬’)>| (E)
Оператор присваивания, дополненный действиями, примет вид:
S I <checkid; put_l5> := E <eqtype; put_lex(‘:=’)>
                      Синтаксически управляемый перевод

       На практике СиА, СеА и генерация внутреннего представления програм-
мы осуществляется часто одновременно. Способ построения промежуточной
программы – синтаксически управляемый перевод. В его основе лежит грамма-
тика с действиями. Параллельно с анализом исходной цепочки лексем осущест-
вляются действия по генерации внутреннего представления программы. Для
этого грамматика дополняется вызовами соответствующих процедур.
       Пример 2.17. Составим процедуры перевода в ПОЛИЗ программы на М
языке.
       ПОЛИЗ представляет собой массив, каждый элемент которого является
парой вида (n, k), где n – номер таблицы лексем, k – номер лексемы в таблице.
Расширяем набор лексем:
       1) в таблицу ограничителей добавляем новые операции ! (18), !F (19),
R (20), W (21);
       2) для ссылок на номера элементов ПОЛИЗа введем нулевую таблицу
лексем, т.е. пара (0, p) - это лексема, обозначающая p-ый элемент в ПОЛИЗе;
       3) чтобы различать операнды-переменные и операнды-адреса перемен-
ных, обозначим переменные как четвертую таблицу лексем, а адреса – пятую.
       Введем следующие обозначения переменных и процедур:
       1) Р – переменная–массив, в который размещается генерируемая про-
грамма;
       2) free – переменная, хранящая номер первого свободного элемента в
массиве P;
       3) LEX – переменная, хранящая очередную лексему;
       4) put_lex(LEX) – запись очередной лексемы в массив P, т.е. P[free]:=LEX
и free:=free+1;
       5) put_l – запись текущей лексемы в массив P;
       6) put_l5 – запись текущей лексемы в массив P с изменением четвертого
класса лексем на пятый;
       7) put_op - запись в массив P знака операции, считанного процедурой
checkop;
       8) make(k) - процедура, формирующая лексему-метку (0, k).
     Правила, описывающие выражения языка М, с учетом действий перевода
в ПОЛИЗ принимают вид.
           Е → Е1 {( > | < | = )  E1 }
           E1→ Т {(+ | - | ∨)  T }
           T→ F {( * | / | ∧)  F}
           F→ I  | N  | L |
           ¬F | (E)
     Оператор присваивания, дополненный действиями, примет вид:
           S→ I  := E 

                                                                                  31