为什么ANTLR需要标记所有或没有替代品?

时间:2017-06-13 21:06:44

标签: antlr grammar antlr4

我是ANTLR的新手。我刚刚发现可以在生产中标记每个替代品,如下所示:

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

然而,我发现必须标记所有或没有替代品是令人不快的。我最近需要在20个分支机构中标记两个生产的替代品,最后我标记了其他每个分支# stubLabel。有没有理由为什么全部或者没有必须贴上标签?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

好的,我相信我已经弄明白了。大概是为了节省空间,对应于每个标签的节点是从与生产相对应的节点子类化的,而不是它的子节点。

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

变为