【发布时间】:2013-10-15 03:45:19
【问题描述】:
如何在一般遍历解析树时访问 ANTLR4 中的备用标签?或者,是否有任何方法可以复制 ANTLR3 的 ^ 运算符的功能,因为这样可以解决问题。
我正在尝试为任何 ANTLR4 语法编写一个 AST 漂亮的打印机,遵循一种简单的方法(例如使用替代标签命名产品)。我希望能够将3 + 5 之类的术语漂亮地打印为(int_expression (plus (int_literal 3) (int_literal 5))),或者类似的东西,给定如下语法:
int_expression
: int_expression '+' int_expression # plus
| int_expression '-' int_expression # minus
| raw_int # int_literal
;
raw_int
: Int
;
Int : [0-9]+ ;
我无法有效地为 plus 和 minus 产品命名,因为将它们拉出到自己的产品中会导致工具抱怨规则是相互左递归的。拉不出来,怎么给这些作品起名字?
注 1:我能够通过将“好”终端(例如,上面的 Int)放入特殊产生式(产生式以特殊前缀开头,如 raw_)在方法上摆脱 + 参数.然后我可以只打印其父产品名为“raw_...”的终端,而忽略所有其他终端。这非常适合摆脱+,同时在输出中保留3 和5。这可以通过 ANTLR3 中的! 来完成。
注 2:我知道我可以为给定语言的每种产品编写专门的漂亮打印机或使用操作,但我想使用 ANTLR4 来解析和生成各种语言的 AST,看起来像我应该能够通用地编写这样一个简单漂亮的打印机。换句话说,我只关心获得 AST,我宁愿不必为了获得 AST 而使用定制的漂亮打印机来阻碍每个语法。也许我应该回到 ANTLR3?
【问题讨论】:
标签: pretty-print antlr4 abstract-syntax-tree