为什么 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。这不能混合(例如,具有整个规则的上下文,同时具有仅某些替代项的上下文)。一旦您开始使用标签并且不再生成规则上下文,您必须为所有替代项生成上下文,否则会丢失某些内容。
我是 ANTLR 的新手。我刚刚发现可以像这样在作品中标记每个备选方案:
foo
: a # aLabel
| b # bLabel
| // ...
;
然而,我觉得所有或 none 替代品都必须被标记是不愉快的。我最近只需要标记一个有 20 多个分支的作品的 2 个备选方案,而我最终标记了其他每个备选方案 # stubLabel
。 all 或 none 有什么理由必须被标记吗?
好的,我相信我已经弄明白了。大概是为了省事space,每个label对应的节点都是production对应节点的子类,而不是它的子节点。
expression
: // ...
| foo # namedMethodInvocation
;
变成
一旦您添加标签,ANTLR4 将不再为该规则生成上下文 class,而是为每个 alt 生成单独的上下文 class。这不能混合(例如,具有整个规则的上下文,同时具有仅某些替代项的上下文)。一旦您开始使用标签并且不再生成规则上下文,您必须为所有替代项生成上下文,否则会丢失某些内容。