2012-02-01 80 views
1

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

对这个过程或我的词汇表的任何意见将是非常有用的。谢谢。

回答

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模块也许一个糟糕的选择。

+0

谢谢,我现在对我应该如何解决这个问题有了更好的理解。 – daybreak 2012-02-01 21:31:29

2

我会使用ANTLR。版本3(当前)支持generating Python code。它将在解析过程中自动生成抽象语法树(AST),然后可以遍历。其中一个重要部分是注释你的语法,将令牌视为子树(例如操作符)。