我有一个针对解释性语言的定制语法,我正在寻找有关解析器的建议,该解析器将创建一个我可以查询的树。我希望能够从结构中生成解释语言的代码。我见过的大多数语法解析器都会验证现有代码。我的问题的第二部分是语法是否应该抽象到 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
可能是一个糟糕的选择。
我是一名优秀的程序员,十分优秀!