有没有办法知道 ANTLR 解析器当前处于哪个替代规则?

Is there a way to know which alternative rule ANTLR parser is currently in?

我想知道 antlr 中当前有哪个替代规则。我读过“the definitivie antlr4 reference”,它使用 ctx.getChildCount() 或 ctx.ID()!=null 来了解哪个替代规则规则 antlr 当前在。

但是我想知道有没有一种方法可以给出备选规则的具体索引

我看到了这个问题 ,但没有答案。

要么使用 alt labels to know in which alternative you are, or try to use options {contextSuperClass=org.antlr.v4.runtime.RuleContextWithAltNum;} (link),但这可能不是您想要的。 contextSuperClass 只会在子规则中告诉您其父规则中的索引是什么:

parent
 : child_a
 | child_b
 | child_c
 | child_d
 | child_e
 ;

child_d
 : ... // in a listener, you can now get index 3 from the parent context
 ;

所以你不能这样做:

parent
 : child_a
 | child_b
 | child_c
 | child_d // get index 3 here
 | child_e
 ;

请注意,contextSuperClass 仅在 Java 中可用,通过查看 link 中的注释似乎可以看出:“我只将 Java 运行时因为我确定我是唯一一个真正会使用它的人。"