Особенности реализации конвертера
Функции для перевода узла синаксического дерева конкретного вида можно разделить на два вида:
V-функции, названия которых начинаются со слова
visit. Особенность V-функций состоит в том, что они в результате просмотра узла возвращают “вычисленное” значение и используются, как правило, для обхода арифметико-логических выражений.P-функции, названия которых начинаются со слова
process. Такие функции обходят узлы, которые по своей сути не являются частями выражений (например, конструкции с циклами и заголовки функций).
P-функции конвертера
Название |
NodeType |
Назначение |
|---|---|---|
|
|
Разбор от начала программы |
|
|
Разбор объявления функции |
|
|
Разбор очередного блока кода |
|
|
Разбор объявления переменной |
|
|
Разбор возврата значения |
|
|
Разбор цикла с предусловием |
|
|
Разбор ветвления |
|
|
Разбор цикла со счетчиком |
V-функции конвертера:
Название |
NodeType |
Назначение |
|---|---|---|
|
|
Разбор арифметико-логических выражений |
|
|
Разбор целочисленного литерала |
|
|
Разбор булевого литерала |
|
|
Разбор числового литерала с дробной частью |
|
|
Разбор строкового литерала |
|
|
Разбор бинарной операции |
|
|
Разбор образения к переменной |
|
|
Разбор вызова функции |
|
|
Разбор доступа к элементу списка |
|
|
Разбор унарной операции |
Для удобства работы с деревом операций при реализации перечисленных
функций каждая из них принимает объект контекста в качестве аргумента.
Этот объект представлен структурой ConverterContext, и содержательная
часть ее объявления выглядит следующим образом.
struct ConverterContext {
struct LocalVariable {
Value::Ptr value;
// ...
};
Operation::Ptr op;
unordered_map<string, Type::Ptr> functions;
forward_list<unordered_map<string, LocalVariable>> variables;
Builder builder;
// ...
};
Таким образом, структура должна хранить в себе:
операцию, внутрь которой должна выполняться дальнейшая вставка операций;
список типов функций;
список переменных с учетом вложенности блоков кода;
объект класса, управляющего вставкой операций.