我有一个很大的ANTLR解析器语法文件,并希望为它创建一个树语法。但是,据我所知,这种树语法生成的工作不能自动完成,即我应该通过复制解析器语法,删除一些不必要的代码等手动生成它。我想知道是否有系统的方法来从解析器语法文件生成树语法文件。
P.S。我读了一篇坚持“Manual Tree Walking Is Better Than Tree Grammars”的文章。这是可靠的信息吗?如果是这样,制作手动树步行器比编写ANTLR树语法文件更好吗?然后,如何使用我的ANTLR解析器语法文件(使用重写规则生成AST)制作手动树行走器?
提前致谢。
答案 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)中,它(很可能)可以在给定组合或解析器语法的情况下自动生成树步行器。
请参阅: