我有一个解释型语言的自定义语法,我正在寻找一个解析器的建议,这将创建一个我可以查询的树。从结构上我希望能够用解释型语言生成代码。我见过的大多数语法分析器都验证已经存在的代码。我的问题的第二部分是应该将语法抽象到Python代码将代替实际代码术语树中的符号的程度?理想情况下,我希望能够查询根符号并返回所有符合该根的符号,并一直到达终端符号。使用Python的文法分析器和从树构建文件
对这个过程或我的词汇表的任何意见将是非常有用的。谢谢。
我有一个解释型语言的自定义语法,我正在寻找一个解析器的建议,这将创建一个我可以查询的树。从结构上我希望能够用解释型语言生成代码。我见过的大多数语法分析器都验证已经存在的代码。我的问题的第二部分是应该将语法抽象到Python代码将代替实际代码术语树中的符号的程度?理想情况下,我希望能够查询根符号并返回所有符合该根的符号,并一直到达终端符号。使用Python的文法分析器和从树构建文件
对这个过程或我的词汇表的任何意见将是非常有用的。谢谢。
绝大多数解析器库都会根据您生成的任何代码创建抽象语法树(AST)你可以使用任何东西,例如pyparsing。要从AST转到代码,您可能必须手动编写函数才能完成此操作,但递归执行操作相当容易。例如:
def generate(ast):
if ast[0] == '+':
return generate(ast[1]) + " + " + generate(ast[2])
elif ast[0] == 'for':
return "for %s in %s:\n" % (ast[1], generate(ast[2])) + generate(ast[3])
...
假设的AST结构,这只是一个列表,其中第一个元素是节点名称标签,随后是任何参数的树:[+, 4, [*, 'x', 5]]
。当然,除非你自己编写解析器,否则你应该使用解析器库使用的任何东西。
我不明白你的意思是用Python代码代替树中的符号来获得实际的代码术语。
你可以写一个简单的函数来遍历根节点下的所有符号:
def traverse_preorder(ast):
yield ast[0]
for arg in ast[1:]:
for x in traverse_preorder(arg):
yield x
关于第二个想法,变量名ast
是因为AST模块也许一个糟糕的选择。
我会使用ANTLR。版本3(当前)支持generating Python code。它将在解析过程中自动生成抽象语法树(AST),然后可以遍历。其中一个重要部分是注释你的语法,将令牌视为子树(例如操作符)。
谢谢,我现在对我应该如何解决这个问题有了更好的理解。 – daybreak 2012-02-01 21:31:29