我目前正在思考如何最好地使用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
非常欢迎任何/所有帮助或想法。非常感谢。
我之前的相关问题(可能有用):
答案 0 :(得分:4)
我建议您阅读Terence Parr撰写的Language Implementation Patterns第9章建立高级口译员。
修改强>
好的,为了让你度过那本书等待的时间,这就是你(至少)需要的东西:
和想到的类( UML-ish 样式):
class Interpreter
class MemorySpace
class Function
答案 1 :(得分:2)
这是一个ANTLR -> LLVM:
答案 2 :(得分:0)
获得AST之后,您只需要一个迭代器来遍历树和模板以发出所需的对象。
答案 3 :(得分:0)
这个Tutorial基于Flex和Bison,但最后他详述了如何将AST转换为LLVM汇编代码,这可能会有所帮助。