Перевод условных выражений в ОПЗ

Пусть имеется условие вида:

Перевод условных выражений в ОПЗ - student2.ru

Это условие в языках программирования записывается как условное выражение вида:

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 ( [ АЭМ Ф
, ) ] THEN ELSE
V
&
 
Отношения
+ -
* /
возведение в степень

Обработка символов операций будет дополнена правилами обработки ключевых слов условных выражений следующим образом:

- символ 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   + M2 БП M1: x   + M2: -
С Т Е К   - ( IF   >     IF M1   +     IF M2   +        
    - (   IF     (   IF M1     (   IF M2        
      -         -   (     -   (   -    
                    -         -        
Входная строка y - ( IF a > b THEN x + ELSE x + ) g

Примечание. Описанная выше обработка условных выражений связана с правильной организацией передачи управления внутри объектного кода, что и составляет внутреннюю семантику обработки условных выражений в ОПЗ.

Перевод оператора присваивания в ОПЗ

Формат оператора присваивания имеет вид:

<переменная> := <выражение>

а его ОПЗ представляется следующим образом:

<переменная> <выражение> :=

Для включения в ОПЗ оператора присваивания необходимо решить вопрос о месте этого оператора в таблице приоритетов. При выборе приоритета будем руководствоваться следующими соображениями:

- приоритет оператора присваивания должен быть выше, чем у любой арифметической или логической операции, чтобы знаки не могли вытолкнуть оператор присваивания из стека;

- приоритет должен быть меньше, чем у знака ';'.

С учетом этого, таблица приоритетов операций принимает следующий вид (табл. 2.5).

Таблица 2.5

Входной элемент Приоритет
IF ( [ АЭМ Ф
, ; ) ] THEN ELSE
:=
V
&
 
Отношения
+ -
* /
возведение в степень

Наши рекомендации