ВУЗ:
Составители:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 29
- 30
- 31
- 32
- 33
- …
- следующая ›
- последняя »