标签'标签'类型与先前定义不匹配:TOKEN_LABEL!= RULE_LABEL

时间:2013-03-18 16:08:51

标签: antlr4

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

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

它出现以下错误:

  

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

看起来这是因为一旦label指向解析器规则,一次指向词法分析器规则。如果我稍微改变规则:

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

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

1 个答案:

答案 0 :(得分:1)

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

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