1

我注意到我不能写这样的规则:

ausdruck: label=ausdruck 'x' #One
        | label='foo'    #Two
        ;

它给出了以下错误:

标签“标签”类型与之前的定义不匹配:TOKEN_LABEL!=RULE_LABEL

看起来这是因为一次标签引用解析器规则,一次引用词法分析器规则。如果我稍微改变规则:

ausdruck: label=ausdruck 'x' #One
        | label2='foo'    #Two
        ;

一切正常。但为什么?我的第一次尝试有什么问题?

4

1 回答 1

1

您似乎发现了一个特定于使用#One标记替代方案的语法的错误。

每个标签对应于生成代码中具有具体类型的字段。规则ausdruck返回AusdruckContext,匹配令牌'foo'返回 a TerminalNode。这些类型不兼容,因此通常标签名称必须不同。但是,由于您标记了外部替代项#One#Two,您应该能够在两个不同上下文中的每一个中包含具有相同名称的标签。

于 2013-03-18T17:21:53.843 回答