ПОЛИЗ КАК ПРОМЕЖУТОЧНЫЙ ЯЗЫК
АЛГОРИТМ ПЕРЕВОДА НА ПРОМЕЖУТОЧНЫЙ ЯЗЫК
Выберем в качестве языка для представления промежуточной программы постфиксную запись (ее часто называют ПОЛИЗ - польская инверсная запись).
Для перевода в ОПЗ обычно применяют метод стека с приоритетами, разработанный известным ученым Е.Дейкстрой для простых выражений. В этом методе операциям и ограничителям, входящим в выражение, ставятся в соответствие целые числа – приоритеты. Для операции приоритете тем выше, чем старше операция. Стек играет роль своеобразного «отстойника» для операции с более низким приоритетом, чем очередная операция. Особая обработка круглых скобок позволяет избавиться от них.
Польская инверсная запись имеет два важных свойства, которые позволяют использовать ее только для представления выражений, но и в качестве промежуточного языка для языковых процессоров:
1. действия, описываемые в ПОЛИЗ, можно выполнять (или программировать) в процессе ее одностороннего безвозвратного просмотра слева направо, т.к. операнды в ПОЛИЗ всегда предшествуют знаку операции
2. операнды ПОЛИЗ расположены в том же порядке, что и в исходном (инфиксном) выражении. Перевод выражения в ПОЛИЗ сводится только к изменению порядка следования знаков операций.
Расширение ПОЛИЗ для представления других конструкций языков программирования (переменных с индексами, указателей функции, условных выражений, основных операторов языка программирования) выполняется очень просто: нужно придерживаться одного правила – знак операции должен следовать непосредственно за соответствующими ему операндами.
В ПОЛИЗе операнды выписаны слева направо в порядке их использования. Знаки операций стоят таким образом, что знаку операции непосредственно предшествуют ее операнды.
Например, обычной (инфиксной) записи выражения
a*(b+c)-(d-e)/f
соответствует такая постфиксная запись:
abc+*de-f/-.
Замечание: обратите внимание на то, что в ПОЛИЗе порядок операндов остался таким же, как и в инфиксной записи, учтено старшинство операций, а скобки исчезли.
Теперь необходимо разработать ПОЛИЗ для операторов входного языка. Каждый оператор языка программирования может быть представлен как n-местная операция с семантикой, соответствующей семантике этого оператора.