生成ANTLR树语法的系统方法?

时间:2011-08-22 07:19:52

标签: antlr tree-grammar

我有一个很大的ANTLR解析器语法文件,并希望为它创建一个树语法。但是,据我所知,这种树语法生成的工作不能自动完成,即我应该通过复制解析器语法,删除一些不必要的代码等手动生成它。我想知道是否有系统的方法来从解析器语法文件生成树语法文件。

P.S。我读了一篇坚持“Manual Tree Walking Is Better Than Tree Grammars”的文章。这是可靠的信息吗?如果是这样,制作手动树步行器比编写ANTLR树语法文件更好吗?然后,如何使用我的ANTLR解析器语法文件(使用重写规则生成AST)制作手动树行走器?

提前致谢。

1 个答案:

答案 0 :(得分:5)

  

sky写道:

     

我想知道是否有一种从解析器语法文件生成树语法文件的系统方法

您已经描述了系统的方法:在树语法中复制解析器/生产规则,只留下重写规则。这可能会处理大部分规则,但使用其他解析器规则(使用内联AST重写规则),它可能看起来略有不同。因此,没有自动生成树语法的方法。

  

sky写道:

     

P.S。我读了一篇坚持'Manual Tree Walking Is Better Than Tree Grammars'的文章。这是可靠的信息吗?

是的,确实如此。请注意,Terence Parr(ANTLR的创建者)自己在ANTLR wiki上发布了这篇文章,因此它的作者(Andy Tripp)提出了有效的观点。

  

sky写道:

     

如果是这样,制作手动树步行器比编写ANTLR树语法文件更好吗?

正如Andy在他的结论中提到的那样:“关于是否使用”树语法“方法进行翻译而不是”手工操作“的决定是一个品味问题。”。所以,如果你认为编写树语法太麻烦,那就去手动方式吧。这取决于你:这里没有最好的方式。

  

sky写道:

     

然后,如何使用我的ANTLR解析器语法文件(使用重写规则制作AST)制作手动树行走器?

您的解析器将创建一个AST,默认情况下为CommonTree (API-doc)类型。您可以使用该树来获取子项,父项,令牌类型等:您需要手动遍历树。

修改

请注意,在下一版本的ANTLR(版本4)中,它(很可能)可以在给定组合或解析器语法的情况下自动生成树步行器。

请参阅: