Преобразование синтаксического дерева Antlr в полезные объекты

В настоящее время я размышляю, как лучше взять AST, сгенерированный с помощью Antlr, и преобразовать его в полезные объекты, которые я могу использовать в своей программе.

Цель моей грамматики (помимо обучения) - создать исполняемый (интерпретируемый во время выполнения) язык.

Например, как бы я взял поддерево атрибута и конкретизировал конкретный класс Attribute. Например

Следующий код на моем языке:

Print(message:"Hello stackru")

будет продукт следующий AST:

http://img36.imageshack.us/img36/1672/simpleast.png

Мое текущее мышление заключается в том, что фабричный класс может прочитать дерево, вытащить имя (message) и введите (STRING) значение("Hello stackru"). Теперь, зная тип, я могу создать правильный класс (например, класс StringAttribute) и передать требуемые данные атрибута - name а также value,

Тот же подход можно использовать для фабрики определений, вытаскивая имя определения (Print), создав экземпляр класса Print, а затем передав атрибуты, сгенерированные из фабрики атрибутов.

Все становится немного сложнее с более сложной программой:

Program(args:[1,2,3,4,5])
{
    If(isTrue:IsInArray(array:{Program.args} value:5))
    {
        Then {
            Print(message:"5 is in the array")
        } Else {
            Print(message:"More complex " + "message")
        }
    }
}

http://img205.imageshack.us/img205/3452/complexast.png

ЛЮБАЯ / ВСЕ помощь или мысли очень приветствуются. Большое спасибо.

Предыдущие похожие вопросы от меня (может быть полезно):

  1. Как мне сделать парсер дерева
  2. Решение проблемы рекурсии LL
  3. Antrl3 условное дерево переписывает

4 ответа

Решение

Я рекомендую прочитать главу 9 " Создание высокоуровневых переводчиков" из " Образцов языковой реализации " Теренса Парра.

РЕДАКТИРОВАТЬ

Хорошо, чтобы помочь вам пережить время ожидания этой книги, вот что вам (по крайней мере) понадобится:

  • глобальное пространство памяти;
  • функциональные пространства (каждое функциональное пространство также будет иметь (локальное) пространство памяти);

и классы, которые приходят на ум (в стиле UML):

  • class Interpreter
    • глобальный: MemorySpace
    • функции: стек<функция>
    • ...

  • class MemorySpace
    • vars: Map
    • ...

  • class Function
    • local: MemorySpace
    • execute (): void
    • ...

Вот один с ANTLR -> LLVM:

Это руководство основано на Flex и Bison, но в конце он подробно описывает, как он конвертирует свой код сборки AST в LLVM, это может быть полезно.

Когда у вас есть AST, все, что вам нужно, это итератор для обхода дерева и шаблон для создания нужных вам объектов.

Другие вопросы по тегам