未使用的解析器规则导致错误,具体取决于定义 - 为什么?

Unused parser rule is causing an error, depending on the definition - WHY?

我遇到了一个我不明白的错误,它与下面的“testRule”有关。

grammar MyTest;

myTest: line+ EOF;

testRule: '\n\n' ; //this produces an error - WHY?
//testRule: '\n\n\n\n' ; //no error
//testRule: Break Break ; //no error

问题是您通过在解析器规则中使用 '\n\n' 间接声明匹配 \n\n 的词法分析器规则。

此 "new" 词法分析器规则在所有其他词法分析器规则之前指定(因为它们是在源代码中的 '...'-构造之后指定的),这导致它首先被查询。

因此输入 \n\n 不会产生两个 Break-tokens,而是一个对应于间接指定的词法分析器规则的单个 token。

由于解析器只关心令牌类型而不关心它的内容,它会告诉你它不知道如何处理它(因为它期待一两个 Break 令牌但是获得了一个 "other" 代币)。因此它抱怨。

这就是为什么您应该 永远不要 在非常小的(测试)语法之外使用那些间接词法分析器规则规范的原因。始终创建一个单独的词法分析器规则,以便您始终可以看到语法中将包含哪些标记类型。