Page 54 - 4761
P. 54
Процедура генерації коду по дереву операцій, перш за все, повинна визначати тип
вузла дерева – він відповідає типу операції, символ якої знаходиться в листку дерева для
поточного вузла. Цей вузол є середнім листом вузла дерева для бінарних операцій і
крайнім лівим листом для упорних операцій. Після визначення типу процедура будує код
для вузла дерева у відповідності рівня з типом операцій. Якщо всі вузли наступного рівня
для поточного вузла є листами дерева, то в код включаються операнди, які відповідають
цим листкам, і отриманий код є результатом виконання процедури.
Тому для побудови внутрішнього представлення програми об’єктного коду по
дереву виводу треба в першу чергу розробити форми представлення об’єктного коду для
4-х випадків, які відповідають видам робочого вузла дерева виводу:
1) два нижче лежачих вузли дерева – листя помічене операндами;
2) тільки лівий нижчележачий є листом дерева;
3) тільки правий нижчележачий є листом дерева;
4) обидва вузли не є листками дерева.
Приклади схем СК-перекладу дерева операцій на мові асемблер
Розглянемо функцію, яка реалізує перевід вузла дерева в послідовність команд
асемблера, яку назвемо code. Вхідними даними функції повинна бути інформація про
вузол дерева операцій. Вихідними даними є послідовність команд мови асемблер.
Таблиця 5.1 – Перетворення вузлів дерева виводу в код на мові асемблер для
арифметичних операцій
Вид вузла дерева Результуючий код Примітка
mov ax, oper1 act - команда
act ax, oper2 відповідної операції
опер1, опер2 – операнди
(листки дерева)
code(вузол2) Вузол2 – нижчележачий
mov dx, ax вузол (не лист) дерева.
mov ax, oper1 Code (вузол2) – код,
act ax, dx який породжує
процедура для
нижчележачого вузла
code(вузол2) Code (вузол2) – код,
act ax, oper2 який породжує
процедура для
нижчележачого вузла
code(вузол2) push і pop – команди
push ax збереження результатів в
code(вузол3) стеку і отримання
mov dx,ax результатів зі стеку
pop ax
act ax,dx
Кожний допустимій арифметичній операції буде відповідати своя команда на мові
асемблер. Наприклад, +, -, *, / – відповідно – add, sub, mul, div.
Код для операції присвоєння відрізняється від арифметичних.
52