我有一个解析器语法,如: C:(A | B)+;
a就像: 名称EQ INT
b就像: 名字EQ ALPHA
当我使用看起来像“b b a”的序列进行测试时,我得到一个错误,指示解析“a”时解析器期望ALPHA失败 - 就像它期待b一样。
我认为(a | b)+会找到任意排序的a和b的链 - 类似于[ab] +的字符类。但是,这似乎是期待最初发现的任何一个选项在没有混合的其他选项的情况下被重复。
我理解(a | b)+错误的含义吗?
答案 0 :(得分:0)
您的理解是正确的 - 这就是它的工作原理。
这里的问题很可能是a
和b
规则与ANTLR(但不是你)的行为完全相同。不能说没有看到再现错误的语法。
请注意,单元测试仅对此类问题提供有限的可见性。要进行调试,首先转储令牌流以确保词法分析器规则正确:令牌类型和文本内容的预期序列。
如果正确,则通过转储解析树来检查解析器规则操作。例如,可以使用Parser#toStringTree()
或grun
工具完成此操作。或者,如果您使用的是IDE,请检查其关联的ANTLR插件。