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)+的意思?
您的理解是正确的 - 这就是它的工作原理。
这里的问题可能是 a
和 b
规则的行为完全符合 ANTLR(但不是你)的意图。没有看到重现错误的语法就不能说。
请注意,单元测试只能有限地了解此类问题。要调试,首先转储令牌流以确保词法分析器规则正确:令牌类型和文本内容的预期序列。
如果正确,则通过转储解析树来检查解析器规则操作。例如,这可以使用 Parser#toStringTree()
或 grun
工具来完成。或者,如果您使用的是 IDE,请查看其关联的 ANTLR 插件。
我有一个像这样的解析器语法: c:(a|b)+;
a 就像: 名称 EQ INT
b 就像: 名称 EQ ALPHA
当我使用看起来像 "b b a" 的序列进行测试时,我收到一条错误消息,指示解析 "a" 失败,因为解析器期待 ALPHA - 就像它期待 b.
我认为 (a|b)+ 会找到任意顺序的 a 和 b 的任何链 - 类似于字符 类 的 [ab]+。但这似乎期望最初发现的任何一个选项都会被重复,而不会混入其他选项。
我是不是理解错了(a|b)+的意思?
您的理解是正确的 - 这就是它的工作原理。
这里的问题可能是 a
和 b
规则的行为完全符合 ANTLR(但不是你)的意图。没有看到重现错误的语法就不能说。
请注意,单元测试只能有限地了解此类问题。要调试,首先转储令牌流以确保词法分析器规则正确:令牌类型和文本内容的预期序列。
如果正确,则通过转储解析树来检查解析器规则操作。例如,这可以使用 Parser#toStringTree()
或 grun
工具来完成。或者,如果您使用的是 IDE,请查看其关联的 ANTLR 插件。