PEGJS : 嵌套的 pegjs 语法

PEGJS : Nested pegjs grammar

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 和存储以前看到的变量(对此我已经有了解决方案)?

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

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]*

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

已测试以下规则:

1 and 2 and 3 => PASS

1 => PASS

4 or 2 or 1 => PASS

9 and 2 or 3 => FAIL