Выделим следующие основные этапы решения задачи:
- описание правил языка программирования;
- выбор единой формы представления ФE программы и алгоритма;
- описание метода перевода алгоритма из формы ФA в форму ФE;
- построить транслятор для выбранного языка, который переводит программу, представленную в форме ФP, в форму ФE.
В качестве языка программирования выберем подмножество алгоритмического языка Паскаль, содержащее операторы цикла с предусловием, присваивания и условного перехода. Все имена переменных состоят из одной заглавной буквы английского алфавита, все константы - целые, комментарии не допускаются. Определенное нами подмножество можно задать в виде синтаксических диаграмм (рис.8.2) [1].
Пусть исходный алгоритм представлен в виде схемы и, соответственно, может содержать операторы присваивания, циклы с предусловием и условные переходы (рис.8.3).
8.3.1. Ориентированный граф
Ориентированный граф (ОТ) является наиболее наглядным представлением программы [2]. Например цепочке лексем а:=b*-c+b*-c будет соответствовать синтаксическое дерево рис.8.4а и соответствующий ориентированный граф рис.8.46.
8.3.2.Трехадресныйкод
Трехадресный код - это последовательность операторов вида х := у ор z, где х, у, z - имена, константы или сгенерированные компилятором временные объекты, ор -двухместная операция. Это линеаризованное представление синтаксического дерева или ориентированного графа, в котором явные имена соответствуют внутренним вершинам дерева или графа. Например,
х + у * z соответствует tl:= у * z; t2:= х + tl,
if A>B then SI else S2 соответствует t:= A - B; JGT t, S2.
Представлению синтаксического дерева (см. рис. 8.4а) соответствует tl:=-с; t2:=b*tl; t3:=-с; t4:=b * t3; t5:= t2 + t1; a:= t5.
Существуют различные реализации трехадресного кода: четверки, тройки, косвенные тройки.
Четверка - это запись с четырьмя полями ( ор, arg1, arg2, result ). Обычно содержимое полей arg1, arg2 и result это указатели на входы таблицы символов для имен, представляемых этими полями. Временные имена вносятся в таблицу символов по мере их генерации. Чтобы избежать внесения новых имен в таблицу символов, на временное значение можно ссылаться, используя позиции вычисляющего его оператора.
Тройки - это запись с тремя полями (ор, arg1, arg2), где arg1 и arg2 либо указатели на таблицу символов, либо указатели на тройки.
Например, представление синтаксического дерева (см. рис.8.4а) четверками в следующее (табл. 8.1).
Таблица 8.1.
op |
arg1 |
arg2 |
Result |
|
(0) (1) (2) (3) (4) (5) |
- + - * + := |
c b c b t2 t5 |
t1 t3 t4 |
t1 t2 t3 t4 t5 a |
8.3.3. Линеаризованные представления
Линеаризованное представление - это запись дерева либо в порядке его обхода снизу-вверх (постфиксная запись, или обратная польская), либо сверху-вниз (префиксная запись, или прямая польская).
Постфиксная запись - это список вершин дерева, в котором каждая вершина следует непосредственно за своими потомками:
a b c - * b c - * + := .
Вершины синтаксического дерева явно не присутствуют, они могут быть восстановлены из порядка, в котором следуют вершины, и из числа операндов соответствующих операций. Восстановление вершин аналогично вычислению выражения в постфиксной записи с использованием стека.
Префиксная запись - это список вершин дерева, в котором идет сначала операция, затем операнды:
:= а + * b – с * b - с.
В качестве формы представления исходного алгоритма и программы выберем постфиксную польскую запись. Перевод программы в польскую запись описан ниже при построении синтаксического блока. Там же описан перевод условий и арифметических выражений.
Предположим, что перевод алгоритма осуществляется вручную по следующим правилам.
1) Для условного перехода польская запись имеет вид:
1. Условие УПнет(м1) Посл-ть блоков м1:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.