【问题标题】:PEGJS : Nested pegjs grammarPEGJS : 嵌套的 pegjs 语法
【发布时间】:2015-08-01 08:16:34
【问题描述】:
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 和存储以前看到的变量(我已经有一个解决方案)?

【问题讨论】:

    标签: javascript peg pegjs


    【解决方案1】:

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

    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

    【讨论】:

    • 感谢 Marcelo 的解决方案。它有效,你是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多