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

使用Python语法分析器并从树构造文件,python,parsing,grammar,Python,Parsing,Grammar,我有一个为解释语言定制的语法,我正在寻找关于解析器的建议,该解析器将创建一个我可以查询的树。从这个结构中,我希望能够生成解释语言中的代码。我所见过的大多数语法分析器都验证已经存在的代码。我问题的第二部分是语法是否应该抽象到Python代码将用树中的符号替换实际的代码术语?理想情况下,我希望能够查询一个根符号,并将该根下的所有符号返回给一个终端符号 关于这个过程的任何建议或者我的词汇都会非常有用。谢谢。我想用ANTLR。版本3当前支持。它将在解析过程中自动生成抽象语法树AST,然后您可以遍历它。这

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


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

我想用ANTLR。版本3当前支持。它将在解析过程中自动生成抽象语法树AST,然后您可以遍历它。这其中的一个重要部分将是注释语法,其中标记将被视为子树,例如运算符。

我将使用ANTLR。版本3当前支持。它将在解析过程中自动生成抽象语法树AST,然后您可以遍历它。这项工作的一个重要部分是对语法进行注释,其中标记将被视为子树,例如运算符。

绝大多数解析器库将根据您正在生成的代码创建抽象语法树AST;你可以用任何东西。要从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可能是一个糟糕的选择。

绝大多数解析器库都会根据您正在生成的代码创建一个抽象语法树ast;你可以用任何东西。要从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可能是一个糟糕的选择。

谢谢,我现在对应该如何进行这项工作有了更好的理解。谢谢,我现在对应该如何进行这项工作有了更好的理解。