ANTLR4 (a|b)+ 应该如何表现

ANTLR4 how should (a|b)+ behave

我有一个像这样的解析器语法: c:(a|b)+;

a 就像: 名称 EQ INT

b 就像: 名称 EQ ALPHA

当我使用看起来像 "b b a" 的序列进行测试时,我收到一条错误消息,指示解析 "a" 失败,因为解析器期待 ALPHA - 就像它期待 b.

我认为 (a|b)+ 会找到任意顺序的 a 和 b 的任何链 - 类似于字符 类 的 [ab]+。但这似乎期望最初发现的任何一个选项都会被重复,而不会混入其他选项。

我是不是理解错了(a|b)+的意思?

您的理解是正确的 - 这就是它的工作原理。

这里的问题可能是 ab 规则的行为完全符合 ANTLR(但不是你)的意图。没有看到重现错误的语法就不能说。

请注意,单元测试只能有限地了解此类问题。要调试,首先转储令牌流以确保词法分析器规则正确:令牌类型和文本内容的预期序列。

如果正确,则通过转储解析树来检查解析器规则操作。例如,这可以使用 Parser#toStringTree()grun 工具来完成。或者,如果您使用的是 IDE,请查看其关联的 ANTLR 插件。