Внедрение AST #
Нужно внедрить AST перед дальнейшим расширением возможностей языка.
Порядок выполнения #
- Проверьте приёмочные тесты — они должны быть устойчивы к рефакторингу за счёт вызова стабильного API вышего проекта
- Спроектируйте AST в отдельном модуле, в том числе:
- иерархию классов узлов вашего языка
- интерфейс
IAstVisitorдля обхода узлов AST
- Внедрите AST в проект
Внедрение в проект #
Для проектов без VM #
Для тех, кто выбрал 🟢 зелёную дорожку:
- класс
Parserтеперь должен строить AST программы вместо вычисления готового результата - для вычисления создайте отдельный модуль, который реализует
IAstVisitorи выполняет вычисления с помощью стека значений - новый модуль можно назвать
Executionили иначе - новый модуль нужно встроить в общий конвейнер интерпретатора, чтобы он принимал AST программы от парсера и выполнял вычисления
Для проектов с VM #
Для тех, кто выбрал 🟡 жёлтую или 🔴 красную дорожку:
- класс
Parserтеперь должен строить AST программы вместо генерации инструкций VM - для генерации инструкций VM создайте отдельный модуль, который реализует
IAstVisitor - новый модуль можно назвать
VmCodegenили иначе - новый модуль нужно встроить в общий конвейнер интерпретатора, чтобы он принимал AST программы от парсера и генерировал программу для VM, которая далее будет передана на выполнение в VM
Требования к AST #
Вы можете поменять именование или способ декомпозиции на классы, если это не ухудшает архитектуру проекта. В языке Go следует использовать идиоматичное именование с учётом имён пакетов.
В иерархии узлов AST предусмотрите абстрактные классы:
AstNode— базовый для всехExpression— базовый для узлов выраженийDeclaration— базовый для узлов объявлений/определенийStatement— базовый для узлов инструкций, если в языке есть инструкции
Для проектов без VM #
Для тех, кто выбрал 🟢 зелёную дорожку:
Класс-посетитель можно назвать AstEvaluator, AstInterpreter или иначе. Он должен:
- Реализовывать интерфейс
IAstVisitor - Вычислять выражения стековым методом
- Делегировать ввод-вывод своим зависимостям (например, через интерфейс
IEnvironment)
Для проектов с VM #
Для тех, кто выбрал 🟡 жёлтую или 🔴 красную дорожку:
Класс-посетитель можно назвать VmCodegen, AstInterpreter или иначе. Он должен:
- Реализовывать интерфейс
IAstVisitor - Генерировать код для стековой виртуальной машины, которую вы разработали для своего языка