ВУЗ:
Составители:
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
- …
- следующая ›
- последняя »
