- •6. Генерация команд в компиляторе 44
- •1. Языки и грамматики
- •1.1. Язык как множество
- •1.2. Порождающая грамматика
- •1.3. Процесс порождения
- •1.4. Классификация грамматик по Хомскому
- •1.5. Классификация языков по Хомскому
- •1.6. Задача распознавания цепочек языка
- •2. Принципы трансляции языков программирования
- •3. Лексический анализ
- •3.1. Конечный автомат
- •3.2. Построение детерминированного конечного автомата
- •3.3. Недетерминированный конечный автомат
- •3.4. Преобразование неоднозначной а-грамматики к однозначной
- •3.5. Удаление из грамматики бесполезных нетерминалов
- •3.6. Лексический анализатор
- •4. Синтаксический анализ
- •4.1. Дерево порождения для кс-грамматики
- •4.2. Автомат с магазинной памятью
- •4.4. Левая рекурсия и ее устранение
- •4.5. Преобразование кс-грамматики к обобщенной нормальной форме Грейбах
- •4.6. Детерминированный ll-разбор
- •5. Обратная польская строка, как промежуточная форма программы
- •5.1. Обратная польская строка для арифметических выражений
- •5.2. Генерация опс для арифметических выражений
- •5.3. Вычисление опс для присваиваний и арифметических выражений с индексами
- •5.4. Генерация опс для присваиваний и арифметических выражений с индексами
- •5.5. Опс для условных, циклических и составных операторов
- •5.6. Опс для стандартных операторов
- •5.7. Распределение памяти и описание переменных
- •5.8. Обработка ошибок
- •6. Генерация команд в компиляторе
- •6.1. Распределение памяти при генерации команд
- •6.2. Генерация команд для присваиваний и арифметических выражений
- •6.3. Генерация команд с индексными выражениями
- •6.4. Генерация команд сравнения и перехода
5. Обратная польская строка, как промежуточная форма программы
5.1. Обратная польская строка для арифметических выражений
Обратная польская строка (ОПС) является бесскобочной записью арифметических выражений. В отличии от обычной (инфиксной) записи, когда знак двуместной операции записывается между операндами, участвующими в операции, в ОПС вначале пишутся операнды, а затем – знак операции. При этом операнды могут быть простыми (переменными, константами), или сложными, т.е. результатами других операций. В табл. 10 приведены примеры формул в обычной записи и в виде ОПС.
Табл. 10
-
№
Формула
ОПС
1
a + b
a b +
2
a*(c + d)
a c d + *
3
(x + y)*(a*x – b*y)
x y + a x * b y * – *
Если в обычной записи формул необходимо учитывать приоритеты операций, то порядок исполнения действий в ОПС полностью определяется местоположением в ней знаков операций. Следует учесть, что при переходе от формулы к ОПС порядок простых операндов не изменяется.
В записи ОПС могут использоваться операции с различным числом операндов: с одним, двумя, тремя и т.д., и даже без операндов. При этом количество операндов определяется знаком операции. Поэтому, в частности, операция «унарный минус» и «бинарный минус» должны обозначаться различающимися знаками.
Вычисление по заданной ОПС можно выполнить интерпретатором, использующим магазин. В магазине сохраняются значения операндов и результаты вычислений. Принцип работы интерпретатора следующий. ОПС просматривается слева направо. Если очередной элемент в ОПС – операнд, то его значение записывается в магазин. Если очередной элемент в ОПС – операция, то из магазина считываются операнды для этой операции, после чего операция выполняется, а ее результат записывается в магазин. Если ОПС корректная, то после всех действий в магазине будет записано единственное значение – результат вычислений.
Пример 9. Дана формула a*(c + d). В табл. 11 приведены шаги алгоритма вычисления ОПС.
Табл. 11
-
№
шага
Входные
символы
Содержимое
магазина
1
a c d + *
2
c d + *
a
3
d + *
a
c
4
+ *
a
c
d
5
*
a
c+d
6
a*(c+d)
Конец примера.
Пример 10. Дана формула (x + y)*(a*x – b*y). В табл. 11 приведены шаги алгоритма вычисления ОПС.
Табл. 12
-
№
шага
Входные
символы
Содержимое
магазина
1
x y + a x * b y * – *
2
y + a x * b y * – *
x
3
+ a x * b y * – *
x
y
4
a x * b y * – *
x+y
5
x * b y * – *
x+y
a
6
* b y * – *
x+y
a
x
7
b y * – *
x+y
a*x
8
y * – *
x+y
a*x
b
9
* – *
x+y
a*x
b
y
10
– *
x+y
a*x
b*y
11
*
x+y
a*x– b*y
12
(x+y)*(a*x–b*y)
Конец примера.