使用Python的语法分析器并从树构造文件

时间:2012-02-01 02:40:46

标签: python parsing grammar

我有一个解释语言的自定义语法,我正在寻找一个解析器的建议,它将创建一个我可以查询的树。从结构我希望能够以解释语言生成代码。我见过的大多数语法分析器都验证了现有的代码。我的问题的第二部分是应该将语法抽象到Python代码将树中的符号替换为实际的代码术语吗?理想情况下,我希望能够查询根符号并返回所有符合该根符号的符号,一直到终端符号。

关于这个过程的任何建议或我的词汇都会非常有帮助。谢谢。

2 个答案:

答案 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可能是一个糟糕的选择。