Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

6. Генерация внутреннего представления программ

.pdf
Скачиваний:
18
Добавлен:
12.01.2020
Размер:
405.73 Кб
Скачать

Языквнутреннегопредставленияпрограммы

Тогда ПОЛИЗ условного оператора будет таким:

B p2 !F S1 p3 ! S2 ... ,

где pi – номер элемента, с которого начинается ПОЛИЗ оператора, помеченного меткой Li, i = 2,3.

Семантика оператора цикла while B do S может быть описана так: L0: if (not B) then goto L1; S; goto L0; L1: ... .

Тогда ПОЛИЗ оператора цикла while будет таким:

B p1 !F S p0! ... ,

где pi – номер элемента, с которого начинается ПОЛИЗ оператора, помеченного меткой Li, i= 0,1.

Языквнутреннегопредставленияпрограммы

Операторы ввода и вывода М-языка являются одноместными операциями.

Пусть R – обозначение операции ввода, W – обозначение операции вывода.

Тогда оператор ввода read (I) в ПОЛИЗе будет записан как I R; оператор вывода write (E) – как E W.

Языквнутреннегопредставленияпрограммы

Постфиксная польская запись операторов обладает всеми свойствами, характерными для постфиксной польской записи выражений, поэтому алгоритм интерпретации выражений пригоден для интерпретации всей программы, записанной на ПОЛИЗе (нужно лишь расширить набор операций; кроме того, выполнение некоторых из них не будет давать результата, записываемого в стек).

Постфиксная польская запись может использоваться не только для интерпретации промежуточной программы, но и для генерации по ней объектной программы. Для этого в алгоритме интерпретации вместо выполнения операции нужно генерировать соответствующие команды объектной программы.

Синтаксическиуправляемыйперевод

На практике синтаксический анализ, семантический анализ и генерация внутреннего представления программы часто осуществляются одновременно.

Существует несколько способов построения промежуточной программы. Один из них, называемый синтаксически управляемым переводом, особенно прост и эффективен.

В основе синтаксически управляемого перевода лежит уже известная нам грамматика с действиями. Теперь, параллельно с анализом исходной строки лексем, будем выполнять действия по генерации внутреннего представления программы. Для этого дополним грамматику вызовами соответствующих процедур генерации.

Синтаксическиуправляемыйперевод

Пример.

Возьмём грамматику: E T {+T}

T F { F} F a | b | (E)

Тогда грамматика с действиями по переводу этого выражения в ПОЛИЗ будет такой:

ET {+T <putchar('+')>}

TF { F <putchar(' ')>}

Fa <putchar('a')> | b<putchar('b')> | (E)

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

Синтаксическиуправляемыйперевод

Пример.

С помощью грамматики с действиями выполним перевод строк языка

L = {0n1m | n, m > 0}

 

 

1

 

= {am bn | n, m > 0}.

в соответствующие строки языка L

2

Язык L1 можно описать грамматикой

 

 

 

S 0S | 1A

 

 

A 1A | ε

Вставим действия по переводу строк вида 0n1m в соответствующие строки вида am bn :

S 0S <putchar('b')> | 1 <putchar('a')>A A1 <putchar('a')>A | ε

Теперь при анализе строк языка L1 с помощью действий будут порождаться соответствующие строки языка L2.