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

Antlr4 (a | b)+应该如何表现,antlr4,Antlr4,我有一个语法分析器,如: c:a | b+ a是这样的: 名称EQ INT b就像: 名称EQ ALPHA 当我使用一个看起来像b a的序列进行测试时,我得到一个错误,表明解析a失败,因为解析器预期的是ALPHA,就好像它预期的是b一样 我认为a | b+可以找到任意顺序的a和b的链-类似于角色类的a[ab]+。但这似乎是在期待最初发现的任何一种选择都会在没有其他选择的情况下被重复 我是否理解a | b+的含义是错误的?你的理解是正确的——这就是它的工作原理 这里的问题可能是a和b规则的行为与A

我有一个语法分析器,如: c:a | b+

a是这样的: 名称EQ INT

b就像: 名称EQ ALPHA

当我使用一个看起来像b a的序列进行测试时,我得到一个错误,表明解析a失败,因为解析器预期的是ALPHA,就好像它预期的是b一样

我认为a | b+可以找到任意顺序的a和b的链-类似于角色类的a[ab]+。但这似乎是在期待最初发现的任何一种选择都会在没有其他选择的情况下被重复


我是否理解a | b+的含义是错误的?

你的理解是正确的——这就是它的工作原理

这里的问题可能是a和b规则的行为与ANTLR完全相同,但不是您想要的。如果没有看到再现错误的语法,就不能说

注意,单元测试对这类问题的可见性有限。要进行调试,首先转储令牌流以确保lexer规则正确:令牌类型和文本内容的预期顺序


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

谢谢您的回复。它帮助我知道我需要在语法的其他地方寻找问题的原因。我使用grun按照您的建议转储令牌流。我明白为什么我会得到这个结果——这是两个lexer规则的顺序,它们给出了相同的长度匹配。我无法逆转,因为它会打破另一个部分。我需要重新思考lexer和parser在我的工作中的作用。