Преобразование синтаксического дерева 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
ЛЮБАЯ / ВСЕ помощь или мысли очень приветствуются. Большое спасибо.
Предыдущие похожие вопросы от меня (может быть полезно):
4 ответа
Я рекомендую прочитать главу 9 " Создание высокоуровневых переводчиков" из " Образцов языковой реализации " Теренса Парра.
РЕДАКТИРОВАТЬ
Хорошо, чтобы помочь вам пережить время ожидания этой книги, вот что вам (по крайней мере) понадобится:
- глобальное пространство памяти;
- функциональные пространства (каждое функциональное пространство также будет иметь (локальное) пространство памяти);
и классы, которые приходят на ум (в стиле UML):
class Interpreter
- глобальный: MemorySpace
- функции: стек<функция>
- ...
class MemorySpace
- vars: Map
- ...
- vars: Map
class Function
- local: MemorySpace
- execute (): void
- ...
Это руководство основано на Flex и Bison, но в конце он подробно описывает, как он конвертирует свой код сборки AST в LLVM, это может быть полезно.
Когда у вас есть AST, все, что вам нужно, это итератор для обхода дерева и шаблон для создания нужных вам объектов.