Внедрение AST

Внедрение AST #

Нужно внедрить AST перед дальнейшим расширением возможностей языка.

Порядок выполнения #

  1. Проверьте приёмочные тесты — они должны быть устойчивы к рефакторингу за счёт вызова стабильного API вышего проекта
  2. Спроектируйте AST в отдельном модуле, в том числе:
    • иерархию классов узлов вашего языка
    • интерфейс IAstVisitor для обхода узлов AST
  3. Внедрите 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 или иначе. Он должен:

  1. Реализовывать интерфейс IAstVisitor
  2. Вычислять выражения стековым методом
  3. Делегировать ввод-вывод своим зависимостям (например, через интерфейс IEnvironment)

Для проектов с VM #

Для тех, кто выбрал 🟡 жёлтую или 🔴 красную дорожку:

Класс-посетитель можно назвать VmCodegen, AstInterpreter или иначе. Он должен:

  1. Реализовывать интерфейс IAstVisitor
  2. Генерировать код для стековой виртуальной машины, которую вы разработали для своего языка