我目前正在考虑如何最好地获取使用 Antlr 生成的 AST,并将其转换为可以在我的程序中使用的有用对象。
我语法的目的(除了学习之外)是创建一种可执行(运行时解释)语言。
例如,我将如何获取属性子树并实例化特定的属性类。例如。
以下代码用我的语言表示:
Print(message:"Hello stackoverflow")
将产生以下 AST:
我目前的想法是工厂类可以读取树,提取名称(message
),然后输入(STRING
) 价值(”Hello stackoverflow
现在,知道了类型,我可以实例化正确的类(例如 StringAttribute 类)并传入所需的属性数据 -name
and 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")
}
}
}
非常欢迎任何/所有帮助或想法。非常感谢。
我之前提出的相关问题(可能有用):
-
我如何制作一棵树
解析器 https://stackoverflow.com/questions/2061166/how-do-i-make-a-treeparser-in-antrl3/2061277#2061277
- 解决LL递归问题 https://stackoverflow.com/questions/2113703/antlr-left-recursive-problem/2117334#2117334
- Antrl3条件树重写 https://stackoverflow.com/questions/2129569/antrl3-conditional-tree-rewrites/2136770#2136770
我建议阅读第9章,培养高水平口译员, from 语言实现模式 http://www.pragprog.com/titles/tpdsl/language-implementation-patterns作者:特伦斯·帕尔
EDIT
好的,为了让您度过等待那本书的时间,您(至少)需要以下内容:
- 全局内存空间;
- 函数空间(每个函数空间还将有一个(本地)内存空间);
以及脑海中浮现的课程(在UML-ish style):
-
class Interpreter
-
class MemorySpace
-
class Function
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)