为什么这个peg语法不能识别42?

时间:2013-07-28 15:41:17

标签: peg pegjs

使用语法

start
  = b
  / a

a
  = "4" "2"

b
  = "4"
带有peg.js

识别4而不是42,在这种情况下错误

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

据报道

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

1 个答案:

答案 0 :(得分:3)

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

对于你的语法,这意味着永远不会尝试第二种选择,因为第一种选择形成了它的前缀。如果您对备选方案进行重新排序,它应该按照您的预期工作。