将Antlr语法树转换为有用的对象

我正在思考如何最好地使用Antlr生成AST并将其转换为有用的对象,我可以在我的程序中使用它。

我的语法(除了学习)的目的是创建一个可执行(运行时解释)语言。

例如,如何获取属性子树并实例化特定的Attribute类。 例如

我的语言中的以下代码:

Print(message:"Hello stackoverflow") 

会产生以下AST:

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

我目前的想法是工厂类可以读取树,提取名称( message ),并键入( STRING )值(“ Hello stackoverflow ”)。 现在,知道我可以实现正确类(例如,一个StringAttribute类)并传入所需属性数据的类型 – namevalue

可以将相同的方法用于定义工厂,提取定义名称( 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 http://img205.imageshack.us/img205/3452/complexast.png

任何/所有的帮助或想法都非常受欢迎。 非常感谢。

以前的相关问题(可能有用):

  1. 如何制作树解析器
  2. 解决LL递归问题
  3. Antrl3条件树重写

我建议阅读Terence Parr的“ 语言实现模式”第9章“ 构建高级解释器”

编辑

好的,为了让你度过等待那本书的时间,这就是你(至少)需要的东西:

  • 全球记忆空间;
  • 函数空间(每个函数空间也有一个(本地)内存空间);

和想到的类(以UML-ish风格):

  • class Interpreter
    • global:MemorySpace
    • function:堆栈<功能>
  • class MemorySpace
    • vars:Map
  • class Function
    • local:MemorySpace
    • execute():void

这是一个ANTLR – > LLVM :

获得AST后,您只需要一个迭代器来遍历树和模板以发出所需的对象。

本教程基于Flex和Bison,但最后他详述了如何将AST转换为LLVM汇编代码,这可能会有所帮助。