如何在一般遍历解析树时访问 ANTLR4 中的备用标签?或者,是否有任何方法可以复制^
ANTLR3 运算符的功能,因为这样可以解决问题。
我正在尝试为遵循简单方法的任何 ANTLR4 语法编写一个 AST 漂亮的打印机(例如使用替代标签命名产品)。我希望能够漂亮地打印一个像3 + 5
as(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
andminus
产品命名,因为将它们拉出到自己的产品中会导致工具抱怨规则是相互左递归的。如果我不能把它们拔出来,我怎么能给这些作品起名字呢?
注 1:我能够通过将“好”终端(例如,上述)放入特殊产生式(产生式以特殊前缀开头,如),从而在方法上摆脱这个+
论点。然后我可以只打印其父产品名为“ ...”的终端,而忽略所有其他终端。这对于摆脱, 同时保持和在输出中非常有效。这可以通过ANTLR3 中的 a 来完成。Int
raw_
raw_
+
3
5
!
注意 2:我知道我可以为给定语言的每种产品编写专门的漂亮打印机或使用操作,但我想使用 ANTLR4 来解析和生成各种语言的 AST,看起来我应该是一般能写出这么简单漂亮的打印机。换句话说,我只关心获得 AST,我宁愿不必为了获得 AST 而使用定制的漂亮打印机来阻碍每个语法。也许我应该回到ANTLR3?