我有一个解释语言的自定义语法,我正在寻找一个解析器的建议,它将创建一个我可以查询的树。从结构我希望能够以解释语言生成代码。我见过的大多数语法分析器都验证了现有的代码。我的问题的第二部分是应该将语法抽象到Python代码将树中的符号替换为实际的代码术语吗?理想情况下,我希望能够查询根符号并返回所有符合该根符号的符号,一直到终端符号。
关于这个过程的任何建议或我的词汇都会非常有帮助。谢谢。
答案 0 :(得分:2)
我会使用ANTLR。版本3(当前)支持generating Python code。它将在解析过程中自动生成抽象语法树(AST),然后您可以遍历该树。其中一个重要的部分是注释您的语法,将令牌作为子树(例如运算符)处理。
答案 1 :(得分:2)
绝大多数解析器库将根据您正在生成的任何代码创建抽象语法树(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
可能是一个糟糕的选择。