- •Проектирование трансляторов
- •Проектирование трансляторов
- •1 Лабораторная работа «Построение лексического анализатора» 8
- •2 Лабораторная работа «Перевод исходной программы в обратную польскую запись» 21
- •3 Лабораторная работа № 3 «Перевод опз исходного выражения в текст на выходном языке. Генерация машинного кода» 47
- •4 Лабораторная работа № 4 «Построение синтаксического анализатора» 55
- •Введение
- •1Лабораторная работа «Построение лексического анализатора»
- •1.1Основные понятия лексического анализа
- •1.2Лексемы простого pl-подобного языка программирования
- •1.3Функции и таблицы лексического анализа
- •1.4Диаграмма состояний лексического процессора
- •2Лабораторная работа «Перевод исходной программы в обратную польскую запись»
- •2.1Понятие обратной польской записи
- •2.2Алгоритм Дейкстры
- •2.3Перевод выражений, содержащих переменные с индексами, в опз
- •2.4 Перевод в опз выражений, содержащих указатели функций
- •2.5Перевод условных выражений в опз
- •2.6Перевод оператора присваивания в опз
- •2.7Перевод оператора безусловного перехода и меток в опз
- •2.8Перевод условного оператора в опз
- •2.9Перевод описаний переменных и процедурных блоков в опз
- •2.10Комплексный пример перевода исходной программы в опз
- •3Лабораторная работа № 3 «Перевод опз исходного выражения в текст на выходном языке. Генерация машинного кода»
- •3.1Базовые понятия
- •3.2Правила генерации машинного кода
- •3.3Комплексный пример перевода опз исходной программы в машинный код
- •4Лабораторная работа № 4 «Построение синтаксического анализатора»
- •Варианты заданий
- •Порядок выполнения лабораторных работ и требования к их оформлению
- •Операторы описания процедур и функций
- •Оператор безусловного перехода и метки
- •Операторы описания процедур и функций
- •Оператор условного перехода
- •Операторы описания данных (идентификаторов и массивов)
- •Проектирование трансляторов
2.5Перевод условных выражений в опз
Пусть имеется условие вида:
Это условие в языках программирования записывается как условное выражение вида:
y=if x=<0 then a+b else c*d;
В отличие от простых выражений, где порядок выполнения действий определяется старшинством операций или скобками и в процессе выполнения программы этот порядок не меняется, в условных выражениях он изменяется в зависимости от значения условия (в нашем примере x <= 0).
Таким образом, понятие условного выражения должно быть также введено в ОПЗ представления исходной программы. Для этого вводятся так называемые динамические деревья.
Рассмотрим ряд понятий и особенностей для динамических деревьев:
узлы и ветви деревьев могут помечаться метками;
пустой узел - это такой узел, в котором отсутствует операция. Из пустого узла может исходить любое количество ветвей. Пустой узел вводится для объединения нескольких последовательных действий или разветвления некоторого вычислительного процесса;
условный оператор перехода по значению 'ложь'. Оператор имеет следующее представление:
<условие> <метка> УПЛ
оператор безусловного перехода:
<метка> БП
С учетом введенных понятий ОПЗ выражения
y+(IF a>b THEN x+y ELSE x+2)
принимает следующий вид:
yab>M1 УПЛ x1+M2 БП М1: x2+M2:+
Для обобщения алгоритма Дейкстры на условные выражения требуется модифицировать таблицу приоритетов, исходя из следующих соображений. Нетрудно заметить, что IF играет роль открывающей скобки, а THEN и ELSE - запятых. Теперь с учетом данного обстоятельства модифицированная таблица приоритетов примет следующий вид (табл. 2.4).
Таблица 2.4
Входной элемент |
Приоритет |
IF ( [ АЭМ Ф |
0 |
, ) ] THEN ELSE |
1 |
V |
2 |
& |
3 |
¬ |
4 |
Отношения |
5 |
+ - |
6 |
* / |
7 |
возведение в степень |
8 |
Обработка символов операций будет дополнена правилами обработки ключевых слов условных выражений следующим образом:
символ IF из входной строки заносится в стек;
символ THEN выталкивает в выходную строку все операции из стека до ближайшего IF. В стеке к символу IF добавляется рабочая метка Мi и после этого в выходную строку записывается часть Мi УПЛ;
ELSE выталкивает из стека все символы до ближайшего IF Мi. IF Mi превращается в IF Mi+1 и в выходную строку выталкивается часть Мi+1 БП Мi:
Символ «)» указывает на конец условного выражения и выталкивает из стека все символы до ближайшего символа «(», при этом сам IF уничтожается, а в выходную строку помещается метка Мi+1: .
Например, для приведенного выражения процесс перевода в ОПЗ имеет вид:
Выходная строка |
y |
|
|
|
a |
|
b |
> |
M1 УПЛ |
x |
|
1 |
+ |
M2 БП M1: |
x |
|
2 |
+ |
M2: |
- |
С Т Е К |
|
- |
( |
IF |
|
> |
|
|
IF M1 |
|
+ |
|
|
IF M2 |
|
+ |
|
|
|
|
|
|
- |
( |
|
IF |
|
|
( |
|
IF M1 |
|
|
( |
|
IF M2 |
|
|
|
|
|
|
|
|
- |
|
|
|
|
- |
|
( |
|
|
- |
|
( |
|
- |
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
- |
|
|
|
|
|
Входная строка |
y |
- |
( |
IF |
a |
> |
b |
THEN |
x |
+ |
1 |
ELSE |
x |
+ |
2 |
) |
|
Примечание. Описанная выше обработка условных выражений связана с правильной организацией передачи управления внутри объектного кода, что и составляет внутреннюю семантику обработки условных выражений в ОПЗ.