Алгоритм прямого преобразования исходной программы в триадную форму

|

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

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

Номер элемента

Синтаксическая категория (класс) элемента (идентификатор, константа, число, строка и т.д.)

Информация о программных переменных, константах и т.д.

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

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

Разумеется, ими должны быть те конструкции исходного языка, которые не принимают активного участия в процессе оптимизации. К ним можно отнести комментарии, операторы DECLARE в языке ПЛ/1 и операторы описания типа DIMENSION, COMMON, EQUIVALENCE в языке Фортран.

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

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

Операции

Приоритет

ПЛ/1

Фортран

Во входной строке

В стеке

(

(

1

1

)

)

1

Нет

ЭМ, Ф, ФАП, ФОП

ЭМ, Ф, ФАП, ФОП, ВПУ

Нет

2

,

,

3

4

|

.OR.

5

6

&

.AND.

7

8

=, >, <,!=, !<, !>, <=, >=

.EQ., .GT., .LT., .NE., .LE., .GE.

9

10

||

||

11

12

+, –

+, –

13

14

*, /

*, /

15

16

И (унарный минус), **, !

И (унарный минус), **, !

17

18

Аналогично при построении элементов исходной программы следует формировать таблицу, состоящую из элементов, являющихся именами процедур (подпрограмм).

Введем некоторые уточнения в принципы, положенные в основу алгоритмов преобразования исходных программ в промежуточную форму (ОПЗ и триады) и изложенные в предыдущем параграфе.

Прежде всего установим приоритеты всех операций, имеющихся во входных языках. В таблице приведены приоритеты всех операций языков ПЛ/1 и Фортран. Здесь не учитывается тот факт, что в языке ПЛ/1 наиболее приоритетные операции выполняются справа налево.

Ввод операций ЭМ, Ф, ФАП, ФОП, ВПУ в промежуточное представление программы производится следующим образом. Если при преобразовании исходной программы в ОПЗ элемент Е(I), рассматриваемый во входной строке исходной программы, является открывающей скобкой «(», то он записывается в стек операций. Сразу же после этого в стеке операций производится следующая запись.

- ЭМ, если предыдущий элемент Е(I—1) являет идентификатором массива;

- Ф, если предыдущий элемент Е(1—1) является идентификатором встроенной (стандартной) функции или процедуры-функции (подпрограммы-функции);

- ФАП, если предыдущий элемент Е(1—1) является именем процедуры-подпрограммы в операторе вызова;

- ФОП, если предыдущий элемент Е(1—1) является ключевым словом PROCEDURE (для языка ПЛ/1) или именем подпрограммы в операторе SUBROUTINE (для языка Фортран);

- ВПУ, если предыдущий элемент Е(1—1) являете ключевым словом IF в языке Фортран.

В противном случае, после того как открывающая скобка помещена в стек операций, следует перейти рассмотрению следующего (I+1)-го элемента входной строки.

Из таблицы видно, что операции ЭМ, Ф, ФАП, ФОП и ВПУ из стека может вытолкнуть и в ОПЗ поместит. только закрывающая скобка.

При преобразовании программы с исходного язык, в ОПЗ необходимо предварительно определить совокупность разделителей (ограничителей) из исходного языка, которые в стеке операций не обрабатываются, но прежде чем переписать их в ОПЗ, необходимо очистить стек. Этим разделителям назначается нулевой приоритет. В языках программирования такими разделителями являются, например знак конца оператора «;» ключевые слова THEN, ELSE, ТО, BY, WHILE и др.

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

Приведенные выше замечания дополняют алгоритм прямого преобразования, принципы построения которого изложены ранее.

Предлагаю ознакомиться с аналогичными статьями: