1
start
  = intExp

intExp
  = andIntExp
  / orIntExp

andIntExp 
   = integer (andExp intExp)*

orIntExp 
   = integer (orExp intExp)*

andExp 
  = space* "and" space* { return "and";}

orExp 
  = space* "or" space*  { return "or";}

space 
  = [\n \t]

integer "integer"
  = digits:[0-9]+ { return parseInt(digits.join(""), 10); }

我想解析输入

2 or 2 or 22 and 2 and 22 or 2 and 2无效。简而言之,我不想在输入中andor一起出现。有没有办法用 peg 做到这一点,而不涉及 javascript 和存储以前看到的变量(我已经有一个解决方案)?

4

1 回答 1

2

解析表达式语法是确定性的。他们尝试第一场比赛并在第一次失配时失败,而且他们不会回溯。您可以否定模棱两可的表达式,您的语法将按预期工作:

Start
  = IntExpr

IntExpr
  = OrIntExpr
  / AndIntExpr

OrIntExpr
  = Integer _ !"and" ("or" _ OrIntExpr)?

AndIntExpr
  = Integer _ ("and" _ AndIntExpr)?

Integer "integer"
  = digits:[0-9]+ { return parseInt(digits.join(""), 10); }

_ "space"
  = [\n \t]*

我们OurExpr拒绝匹配如果收到and并跳转到下一个选项。

以下规则已经过测试:

1 and 2 and 3=>PASS

1=>PASS

4 or 2 or 1=>PASS

9 and 2 or 3=>FAIL

于 2015-08-01T00:16:34.443 回答