将Antlr语法树转换为有用的对象
我正在思考如何最好地使用Antlr生成AST并将其转换为有用的对象,我可以在我的程序中使用它。
我的语法(除了学习)的目的是创建一个可执行(运行时解释)语言。
例如,如何获取属性子树并实例化特定的Attribute类。 例如
我的语言中的以下代码:
Print(message:"Hello stackoverflow")
会产生以下AST:
alt text http://img36.imageshack.us/img36/1672/simpleast.png
我目前的想法是工厂类可以读取树,提取名称( 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 http://img205.imageshack.us/img205/3452/complexast.png
任何/所有的帮助或想法都非常受欢迎。 非常感谢。
以前的相关问题(可能有用):
- 如何制作树解析器
- 解决LL递归问题
- Antrl3条件树重写
我建议阅读Terence Parr的“ 语言实现模式”第9章“ 构建高级解释器” 。
编辑
好的,为了让你度过等待那本书的时间,这就是你(至少)需要的东西:
- 全球记忆空间;
- 函数空间(每个函数空间也有一个(本地)内存空间);
和想到的类(以UML-ish风格):
-
class Interpreter
- global:MemorySpace
- function:堆栈<功能>
- …
-
class MemorySpace
- vars:Map
- …
- vars:Map
-
class Function
- local:MemorySpace
- execute():void
- …
这是一个ANTLR – > LLVM :
获得AST后,您只需要一个迭代器来遍历树和模板以发出所需的对象。
本教程基于Flex和Bison,但最后他详述了如何将AST转换为LLVM汇编代码,这可能会有所帮助。