
- •1.Прямые методы трансляции
- •1.1.Сущность польской записи
- •1.2.Перевод в опз арифметических и логических выражений
- •1.3.Перевод в опз переменных с индексами
- •1.4.Получение опз для указателей функций
- •1.5.Получение опз для оператора присваивания
- •1.6.Получение опз для условного оператора
- •1.7.П олучение опз для оператора цикла for
1.5.Получение опз для оператора присваивания
Д
ерево
оператора присваивания a := b + c
Его ОПЗ имеет вид: a b c + :=
Приоритет знака присваивания должен быть меньше приоритета знака любой арифметической и логической операции, поскольку операция присваивания выполняется после вычисления выражения.
С другой стороны приоритет знака присваивания должен быть больше приоритетов знаков конца оператора (точка с запятой, end и else), чтобы знак конца оператора очищал стек.
1.6.Получение опз для условного оператора
До сих пор мы рассматривали конструкции, в которых порядок действий определяется только старшинством операций и скобками, и в ходе исполнения программы не изменяется.
Такие конструкции изображаются статическим деревом.
Для изображения дерева условного оператора понадобятся динамические деревья.
Для этого введем метки, которыми могут помечаться листья и некоторые узлы динамических деревьев. Введем две операции:
- условный переход по значению «ложь» (УПЛ);
- безусловный переход (БП).
Операция УПЛ имеет два операнда: первый – логическое выражение, а второй – метка.
Если логическое выражение истинно, то операция УПЛ пропускается, а если ложно, то происходит переход на метку.
У операции БП имеется лишь один операнд – метка. Результат перехода БП – переход на метку.
Условный оператор вида: if A then B else C;
где А – логическое выражение;
В и С – операторы, можно представить в виде динамического дерева:
З
нак
«;» не является знаком операции.
Отвечающий ему узел играет роль пустого узла и служит для объединения нескольких последовательно выполняемых действий.
В ОПЗ знак «;» можно не переносить. Обход дерева дает ОПЗ:
A m1 УПЛ В m2 БП m1: С m2:
Ч
астным
случаем условного оператора является
оператор: if A then B ;
Его дерево:
Его ОПЗ: A m1 УПЛ В m1:
Ограничители if, then и else играют роль скобок: символ if эквивалентен открывающей скобки, а символы then и else, подобно запятым в списках индексов и фактических параметров, являются закрывающими скобками для предшествующего оператора или выражения и открывающими для последующего.
Закрывающей скобкой для оператора, следующего за else, служит точка с запятой или end.
По этим причинам символу if припишем приоритет 0, а символам then и else – 1.
Рассмотрим особенности обработки:
1. Символ if записывается в стек и используется в качестве «хранителя» рабочих меток операций УПЛ и БП. При появлении символа then запись if превращается в if mi, а появление символа else превращает последнюю в if mi mi+1.
Здесь i – номер очередной рабочей метки.
2. Символ then с приоритетом 1 выталкивает из стека все знаки до первого if исключительно. При этом в выходную строку заносится запись mi УПЛ ,
где i – номер очередной нечетной рабочей метки.
Затем метка mi заносится в таблицу меток; к символу if в вершине стека дописывается mi (получается запись if mi).
3. Символ else с приоритетом 1 выталкивает из стека все знаки до первого if исключительно.
В выходную строку добавляется запись mi+1 БП mi : ,
затем метка mi+1 заносится в таблицу меток, а в вершину стека к записи if mi дописывается метка mi+1 (получается запись if mi mi+1).
4. Конец оператора ( ; или end ) выталкивает из стека его содержимое до записи вида if mi или if mi mi+1 ; такая запись удаляется из стека, а в выходную строку в первом случае записывается mi, а во втором – mi+1: .
Пример: Перевести в ОПЗ оператор if a=b then begin a: =0; goto M end else a: =1 ;
получается
a b = m1 УПЛ a 0 := М БП m2 БП m1: a 1 := m2: .
То же самое получается обходом дерева: