Преобразование синтаксического дерева Antlr в полезные объекты - PullRequest
4 голосов
/ 07 февраля 2010

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

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

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

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

Print(message:"Hello stackoverflow")

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

alt text

В настоящее время я считаю, что фабричный класс может читать дерево, извлекать имя (message) и тип (STRING) значения ("Hello stackoverflow"). Теперь, зная тип, я мог бы создать правильный класс (например, класс 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")
        }
    }
}

alt text

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

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

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

Ответы [ 4 ]

4 голосов
/ 07 февраля 2010

Я рекомендую прочитать главу 9, Создание высокоуровневых переводчиков , из Шаблоны языковой реализации от Terence Parr.

EDIT

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

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

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

  • class Interpreter
    • global: MemorySpace
    • функций: стек
    • ...

  • class MemorySpace
    • vars: Map
    • ...

  • class Function
    • local: MemorySpace
    • execute (): void
    • ...
2 голосов
/ 17 февраля 2010

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

0 голосов
/ 09 февраля 2010

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

0 голосов
/ 07 февраля 2010

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

...