我注意到我不能写这样的规则:
ausdruck: label=ausdruck 'x' #One
| label='foo' #Two
;
它出现以下错误:
标签'标签'类型与之前的定义不匹配: TOKEN_LABEL!= RULE_LABEL
看起来这是因为一旦label指向解析器规则,一次指向词法分析器规则。如果我稍微改变规则:
ausdruck: label=ausdruck 'x' #One
| label2='foo' #Two
;
一切正常。 但为什么?我的第一次尝试出了什么问题?
答案 0 :(得分:1)
您似乎发现了一个特定于使用#One
语法标记备选方案的错误。
每个标签对应于生成的代码中具有具体类型的字段。规则ausdruck
返回AusdruckContext
,匹配令牌'foo'
会返回TerminalNode
。这些类型不兼容,因此标签名称通常必须不同。但是,由于您标记了外部替代方案#One
和#Two
,因此应该能够在两个不同的上下文中包含具有相同名称的标签。