为什么 ANTLR 要求标记所有或 none 个备选方案?

Why does ANTLR require all or none alternatives be labeled?

我是 ANTLR 的新手。我刚刚发现可以像这样在作品中标记每个备选方案:

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

然而,我觉得所有或 none 替代品都必须被标记是不愉快的。我最近只需要标记一个有 20 多个分支的作品的 2 个备选方案,而我最终标记了其他每个备选方案 # stubLabel。 all 或 none 有什么理由必须被标记吗?

好的,我相信我已经弄明白了。大概是为了省事space,每个label对应的节点都是production对应节点的子类,而不是它的子节点。

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

变成

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