2017-06-22 57 views
1

我有一个带有替代标签的解析器规则。
我想实现当任何标签都是很好的参观了访问者方法:所有标签的访问方法

someRule 
    : 'a' #aLabel 
    | 'b' #bLabel 
    | 'c' #cLabel 
    ; 

我需要一些像这样的方法:

T visitSomeRule(SomeRuleContext ctx) 

回答

1

像你这样的标签,你会结束了类似:

override VisitAlabel(aLabelRuleContext) {....} 
override VisitBlabel(bLabelRuleContext) {....} 
override VisitClabel(cLabelRuleContext) {....} 

然而,增加的替代标签,使ANTLR4不生成一般上下文类SomeRuleContext在你上面的例子中。不可能混合使用两者。非此即彼。如果你想获得SomeRuleContext则必须删除标签并检查处理器内部的替代上下文的SomeRuleContext.

我的源:这个和权威ANTLR4参考由特伦斯·帕尔的经验,第120页。

+0

也许我可以重写访问方法并检查参数的类型?尽管如此,这看起来像是一种拙劣的方式。 – Midnightas

+0

是的,这就是我在回答中所指的。如果您阅读Terence Parr关于替代标签的书,很明显这个功能是通过更加集中的子类来增加“更精确”的上下文。而且我发现我更喜欢在我的大部分工作中使用标签。但是,如果你确实需要更高层次的上下文,那么你肯定可以遍历它的子节点,检查它们的类型,并单独对它们执行操作。这是可能的,我已经做到了。直到我了解到替代标签。 ;) – TomServo