使用PEG.js解析此语法时出现意外行为

时间:2015-01-22 17:03:41

标签: javascript parsing syntax antlr peg

我是正式语法世界的新手。我试图使用ANTLR for JS但无法弄清楚如何运行解析器。我正在尝试为PEG.js上的DSL开发语法,这就是我所拥有的(http://peg.arcanis.fr/3T2PKD/):

start 
  = expr

operator
  = "show" lparen st:string ws rparen { console.log(7)}
  / "show" lparen ex:expr rparen      { console.log(8)}

expr 
 = op: operator ws ex: expr  {console.log (1)}
 / st:string ws ex: expr     {console.log (2)}
 / st:string ws op:operator  {console.log (3)}
 / op:operator ws str:string {console.log (4)}
 / st:string ws              {console.log (5)}
 / op:operator ws            {console.log (6)}

lparen
  = ws "(" ws

rparen
  = ws ")" ws

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

string "string"
  = quotation_mark chars:char* quotation_mark { return chars.join(""); }

ws "whitespace" = [ \t\n\r]*

char
  = unescaped
  / escape
    sequence:(
        '"'
      / "\\"
      / "/"
      / "b" { return "\b"; }
      / "f" { return "\f"; }
      / "n" { return "\n"; }
      / "r" { return "\r"; }
      / "t" { return "\t"; }
      / "u" digits:$(HEXDIG HEXDIG HEXDIG HEXDIG) {
          return String.fromCharCode(parseInt(digits, 16));
        }
    )
    { return sequence; }

escape         = "\\"
quotation_mark = '"'
unescaped      = [\x20-\x21\x23-\x5B\x5D-\u10FFFF]

/* ----- Core ABNF Rules ----- */

/* See RFC 4234, Appendix B (http://tools.ietf.org/html/rfc4627). */
DIGIT  = [0-9]
HEXDIG = [0-9a-f]i

{
  ;
}

当测试时:show ("abc")控制台不应该显示 7 6 ?

相反,它显示 7 7 7 6

过去3天一直绞尽脑汁。有人在某处帮助我实现 简约!

1 个答案:

答案 0 :(得分:1)

解析器必须先尝试规则op: operator ws ex: exprop:operator ws str:string才能最终成功op:operator ws。它不知道那些在找不到)以外的任何内容之后才会起作用。

因此,它只通过operator规则,没有看到另一个表达式,所以它回溯了。然后它会看到第二时间的operator,而仍然不起作用,因为它之后没有字符串。最后,在第三次尝试时,它会看到运营商,然后最后一条规则成功。

您对console.log(7)的来电是因为operator规则本身成功,即使expr规则没有。