7

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

PS 我读了一篇文章,坚持认为“手动树行走比树语法更好”。这是可靠的信息吗?如果是这样,对我来说,制作手动树步行器会比编写 ANTLR 树语法文件更好吗?然后,如何使用我的 ANTLR 解析器语法文件制作手动树遍历器(它使用重写规则制作 AST)?

提前致谢。

4

1 回答 1

5

天空写道:

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

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

天空写道:

PS 我读了一篇文章,坚持认为“手动树行走比树语法更好”。这是可靠的信息吗?

是的。请注意,Terence Parr(ANTLR 的创建者)自己在 ANTLR wiki 上发布了这篇文章,所以说它的作者(安迪·特里普)提出了有效的观点。

天空写道:

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

正如安迪在他的结论中提到的那样:“关于是否使用“树语法”方法进行翻译与仅使用“手工”进行翻译的决定是一个品味问题。” . 因此,如果您认为编写树语法太麻烦,请使用手动方式。这取决于你:这里没有最好的方法。

天空写道:

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

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

编辑

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

看:

于 2011-08-22T08:26:37.213 回答