В настоящее время я размышляю, как лучше взять AST, сгенерированный с помощью Antlr, и преобразовать его в полезные объекты, которые я могу использовать в своей программе.
Цель моей грамматики (помимо обучения) - создать исполняемый (интерпретируемый во время выполнения) язык.
Например, как бы я взял поддерево атрибута и создал бы конкретный класс Attribute. Например.
Следующий код на моем языке:
Print(message:"Hello stackoverflow")
будет производить следующий AST:
В настоящее время я считаю, что фабричный класс может читать дерево, извлекать имя (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")
}
}
}
ЛЮБАЯ / ВСЕ помощь или мысли очень приветствуются. Большое спасибо.
Предыдущие похожие вопросы от меня (может быть полезно):
- Как мне сделать дерево
парсер
- Решение проблемы рекурсии LL
- Переписывается условное дерево Antrl3