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

时间:2010-02-07 15:08:25

标签: java antlr execution abstract-syntax-tree

我目前正在思考如何最好地使用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. How do I make a tree parser
  2. Solving LL recursion problem
  3. Antrl3 conditional tree rewrites

4 个答案:

答案 0 :(得分:4)

我建议您阅读Terence Parr撰写的Language Implementation Patterns第9章建立高级口译员

修改

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

  • 全局存储空间;
  • 函数空间(每个函数空间也有一个(本地)内存空间);

和想到的类( UML-ish 样式):

  • class Interpreter
    • global:MemorySpace
    • functions:Stack< Function>
    • ...

  • class MemorySpace
    • vars:Map< String,Object>
    • ...

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

答案 1 :(得分:2)

这是一个ANTLR -> LLVM

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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