Написание простого DSL компилятора на Delphi (5. Фреймворк)

Перевод поста Writing a Simple DSL Compiler with Delphi (5. Framework).

Эта статья представляет собой описание фреймворка используемого для проекта моего языка программирования. Если вы только начинаете читать эту серию, то я бы рекомендовал вам начать с этого поста.

Сейчас у нас есть работающий парсер который преобразует строку кода в абстрактное синтаксическое дерево. Однако ещё не время писать о самой интересной части — компиляторе — сначала мы должны сделать интеграцию и тестирование.

Мой игрушечный компилятор использует очень простой фреймворк доступ к которому производится через интерфейс ISimpleDSLCompiler (модуль SimpleDSLCompiler). Уместная часть интерфейса показана ниже:

Фреймворк представляет функции для разбора входных данных (Parse), генерации исполняемого кода (Codegen) и оба эти действия в один шаг (Compile), но он понятия не имеет как это делать. Вся функциональность реализована снаружи — через токинизатор, парсер и движок генерации кода что который создаётся в фабричном методе (TokenizerFactory).

Чтобы сделать конфигурацию простой, TSimpleDSLCompiler.Create устанавливает фабрики по умолчанию, создавая типичные классы движков. Если вы хотите подключить свою собственную реализацию отдельного шага, вы можете сделать это установив подходящее свойство XXXFactory перед вызовом любой функции этого интерфейса. Мы будем использовать эту возможность для реализации "AST Dumper" в следующей части этого блога.

Давайте быстро взглянем на все три функции API. Самая важная — Compile, не делает ничего кроме вызова парсера и (если обрабатываемый код корректен) генератора кода. Здесь нет ничего особенного.

Вторая — Parse, создаёт движки парсера и токинезатора, подготавливает AST (FAST) и вызывает метод парсера Parse. Большинство из этого просто обвязка, и вся реальная работа делается в parser.Parse.

Последний — Codegen такой же простой. После нескольких проверок он создаёт движок генерации кода и вызывает его метод Generate передавая в него AST. Мы не рассматривали генератор кода, так что пока достаточно сказать, что генератор кода предоставляет одну функцию — Generate которая конвертирует ISimpleDSLAST в ISimpleDSLProgram.

Всё это позволяет нам очень просто вызывать компилятор:

В следующей части мы увидим как можно сохранить сгенерированное AST в текстовую форму заменой CodegenFactory.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *