Компиляция дерева выражений в команды
Компилятор урока может превращать дерево выражений в команды стека, которые отдельная машина выполняет позже.
Как дерево выражений превращается в линейную последовательность команд?
- Генерация команд констант и арифметики из синтаксических данных
- Сохранение порядка операндов в коде для стека
- Разделение компиляции и выполнения на машине
Процедура compile генерирует код левого операнда, затем код правого операнда и в конце одну арифметическую команду. Рекурсия разворачивает вложенное выражение в линейный список.
Процедура execute помещает константы в стек. Арифметическая команда извлекает правое и левое значения, объединяет их и помещает результат в стек. Когда кода не остается, вершина стека становится значением программы.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает пять сгенерированных команд и вычисленное значение 17.
Отделите рекурсивные вызовы compile от последующих вызовов execute. Во время выполнения каждая команда считывает код, изменяя стек.
Измените программу и сравните результат.
Скомпилируйте (+ 1 (* 2 (+ 3 4))). Запишите список команд перед тем, как выполнить его.
Показать подсказку
Каждое число генерирует const. Каждое составное выражение генерирует свой оператор после обоих операндов.