Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основные этапы трансляции.doc
Скачиваний:
7
Добавлен:
19.11.2019
Размер:
413.18 Кб
Скачать

3.3. Схема су - перевода дерева операций в последовательность триад

Функцию, реализующую перевод узла дерева в последовательность триад, назовем Code. Входные и выходные данные у этой функции будут те же, что и при работе с командами ассемблера. Триады являются машинно – независимой формой внутреннего представления в компиляторе результирующей объектной программы, а потому не требуют дополнительных условий при генерации кода. Триады взаимосвязаны между собой, поэтому для установки корректной взаимосвязи функция генерации кода должна учитывать также текущий номер очередной триады (i).

Будем рассматривать те же варианты узлов дерева, что и для команд ассемблера (табл. 2.3).

Таблица 2.3

Вид узла дерева

Результирующий код

Примечание

i) act (oper1, oper2)

act – тип триады

oper1, oper2 – операнды (листья дерева)

i) Code (Узел 2, i)

i+j) act (oper1, ^i+j-1)

Узел 2 – нижележащий узел (не лист) дерева

Code (Узел 2, i) – последовательность триад, порождаемая для Узла 2, начиная с триады с номером i, j – количество триад, порождаемых для Узла 2

i) Code (Узел 2, i)

i+j) act (^i+j-1, oper2)

Узел 2 – нижележащий узел (не лист) дерева

Code (Узел 2, i) – последовательность триад, порождаемая для Узла 2, начиная с триады с номером i, j – количество триад, порождаемых для Узла 2

i) Code (Узел 2, i)

i+j) Code (Узел 3, i+j)

i+j+k) act (^i+j-1, ^i+j+k-1)

Code (Узел 2, i) – последовательность триад, порождаемая для Узла 2, начиная с триады с номером i, j – количество триад, порождаемых для Узла 2 Code (Узел 3, i+j) – последовательность триад, порождаемая для Узла 3, начиная с триады с номером i+j, k – количество триад, порождаемых для Узла 3

Для триад не требуется учитывать операцию присваивания как отдельный тип узла дерева. Она преобразуется в триаду обычного вида. Рассмотрим в качестве примера дерево, приведенное на рис. 2. Согласно принципу СУ – перевода, построение начинается от корня дерева.

Шаг 1: 1) Code(U2, 1)

i) := (A, ^i-1)

Шаг 2: 1) Code(U3, 1)

j) Code(U5, j)

i-1) –(^j-1, ^i-2)

i) := (A, ^i-1)

Шаг 3: 1) Code (U4, 1)

k) + (^k-1, D)

j) Code(U5, j)

i-1) –(^j-1, ^i-2)

i) := (A, ^i-1)

Шаг 4: 1) *(B,C)

2) +(^1, D)

3) Code (U5, 3)

i-1) – (^j-1, ^i-2)

i) :=(A, ^i-1)

Шаг 5: 1) *(B,C)

2) +(^1, D)

3) *(B, 10)

4) –(^2, ^3)

5) :=(A, ^4)

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

Как и последовательность команд ассемблера, последовательность триад можно оптимизировать