sky*_*sky 6 antlr tree-grammar
我有一个很大的ANTLR解析器语法文件,并希望为它创建一个树语法.但是,据我所知,这种树语法生成的工作不能自动完成,即我应该通过复制解析器语法,删除一些不必要的代码等手动生成它.我想知道是否有系统的方法来从解析器语法文件生成树语法文件.
PS我读了一篇坚持" 手工树行走比树语法更好 "的文章.这是可靠的信息吗?如果是这样,制作手动树步行器比编写ANTLR树语法文件更好吗?然后,如何使用我的ANTLR解析器语法文件创建一个手动树行走器(它使用重写规则制作AST)?
提前致谢.
sky写道:
我想知道是否有一种从解析器语法文件生成树语法文件的系统方法
您已经描述了执行此操作的系统方法:在树语法中复制解析器/生产规则,并仅在其中保留重写规则.这可能会处理大部分规则,但使用其他解析器规则(使用内联AST重写规则),它可能看起来略有不同.因此,没有自动生成树语法的方法.
sky写道:
PS我读了一篇坚持"手工树行走比树语法更好"的文章.这是可靠的信息吗?
是的.请注意,Terence Parr(ANTLR的创建者)自己在ANTLR wiki上发布了这篇文章,因此它的作者(Andy Tripp)提出了有效的观点.
sky写道:
如果是这样,制作手动树步行器比编写ANTLR树语法文件更好吗?
正如安迪在他的结论中提到的那样:"关于是否使用"树语法"方法进行翻译而不仅仅是"手工操作"的决定是一个品味问题..所以,如果你认为编写树语法太麻烦,那就去手动方式吧.这取决于你:这里没有最好的方法.
sky写道:
然后,如何使用我的ANTLR解析器语法文件创建一个手动树行走器(它使用重写规则制作AST)?
您的解析器将创建一个AST,默认情况下是类型CommonTree(API-doc).您可以使用该树来获取子项,父项,令牌类型等:您需要手动遍历树.
请注意,在下一版本的ANTLR(版本4)中,它(很可能)可以在给定组合或解析器语法的情况下自动生成树步行器.
看到: