为什么ANTLR要求标记所有或无替代品?

为什么ANTLR要求标记所有或无替代品?,antlr,grammar,antlr4,Antlr,Grammar,Antlr4,我是ANTLR的新手。我刚刚发现,可以在生产中标记每个备选方案,如下所示: foo : a # aLabel | b # bLabel | // ... ; 然而,我觉得很不愉快的是,所有或没有替代品都必须贴上标签。最近,我只需要为一个具有20多个分支的产品的两个备选方案添加标签,而我最终为其他每个产品添加了标签#stubLabel。是否有任何理由必须全部或全部贴标签?好的,我相信我已经找到了答案。可能是为了节省空间,与每个标签对应的节点是从与产品对应的节点中派

我是ANTLR的新手。我刚刚发现,可以在生产中标记每个备选方案,如下所示:

foo
    : a # aLabel
    | b # bLabel
    | // ...
    ;

然而,我觉得很不愉快的是,所有或没有替代品都必须贴上标签。最近,我只需要为一个具有20多个分支的产品的两个备选方案添加标签,而我最终为其他每个产品添加了标签
#stubLabel
。是否有任何理由必须全部或全部贴标签?

好的,我相信我已经找到了答案。可能是为了节省空间,与每个标签对应的节点是从与产品对应的节点中派生出来的子类,而不是它的子类

expression
    : // ...
    | foo # namedMethodInvocation
    ;
变成


一旦添加标签,ANTLR4将不再为该规则生成上下文类,而是为每个alt生成单独的上下文类。这不能混合(例如,为整个规则生成上下文,同时为部分alt生成上下文)。一旦您开始使用标签,并且不再生成规则上下文,您必须为所有ALT生成上下文,否则会丢失一些内容