2

使用语法

start
  = b
  / a

a
  = "4" "2"

b
  = "4"

withpeg.js识别 4 但不是 42 在这种情况下错误

“第 1 行,第 2 列:预期输入结束,但找到了“2”。”

被报道。显然,解析器完成了start -> b消耗“4”的规则,然后不知道如何处理“2”。a但是,当它遇到错误时,为什么不使用其他规则再次尝试呢?

4

1 回答 1

3

在 PEG 语法中,选择运算符被称为“优先选择”,替代项意味着按照在语法中出现的顺序进行处理。在运行时,PEG 解析器将开始处理具有第一个备选方案的选择。当失败时,解析器会回溯到解析该替代方案之前的状态,然后继续下一个。但是,一旦成功,则假定替代方案是正确解析的一部分,并且对于当前选择不考虑任何剩余的替代方案。

对于您的语法,这意味着永远不会尝试第二种选择,因为第一种形成了它的前缀。如果您对替代品重新排序,它应该可以按您的预期工作。

于 2013-07-29T06:38:12.933 回答