Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 所有标签的访问者方法_Java_Antlr4 - Fatal编程技术网

Java 所有标签的访问者方法

Java 所有标签的访问者方法,java,antlr4,Java,Antlr4,我有一个带有可选标签的解析器规则。 我想为任何标签的良好访问实现一个访问者方法: someRule : 'a' #aLabel | 'b' #bLabel | 'c' #cLabel ; 我需要这样的方法: T visitSomeRule(SomeRuleContext ctx) 有了像您这样的标签,您最终会得到如下结果: override VisitAlabel(aLabelRuleContext) {....} override Visi

我有一个带有可选标签的解析器规则。
我想为任何标签的良好访问实现一个访问者方法:

someRule
    :    'a' #aLabel
    |    'b' #bLabel
    |    'c' #cLabel
    ;
我需要这样的方法:

T visitSomeRule(SomeRuleContext ctx)

有了像您这样的标签,您最终会得到如下结果:

override VisitAlabel(aLabelRuleContext) {....}
override VisitBlabel(bLabelRuleContext) {....}
override VisitClabel(cLabelRuleContext) {....}
但是,在上面的示例中,添加替代标签会导致ANTLR4不生成泛型上下文类
SomeRuleContext
。不可能两者兼而有之。一个或另一个。如果要访问
SomeRuleContext
,则必须删除标签并检查
SomeRuleContext处理程序中的替代上下文。


我的资料来源:这方面的经验以及Terence Parr的最终ANTLR4参考,第120页。

也许我可以覆盖访问方法并检查参数的类型?不过,这似乎是一种老生常谈的方式。是的,这就是我在回答中所指的。如果您阅读了Terence Parr关于替代标签的书,很明显,添加此功能是为了通过更集中的子类化提供“更精确”的上下文。我发现我的大部分工作都喜欢使用标签。但是,如果您确实需要更高级别的上下文,您当然可以遍历它的子级,检查它们的类型,并单独对它们执行操作。这是可能的,我已经做到了。直到我了解了替代标签