簡體   English   中英

用PEG.js解析此語法的意外行為

[英]Unexpected Behaviour with parsing this grammar with PEG.js

我是形式語法世界的新手。 我試圖將ANTLR用於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

在過去的三天里,我一直在絞盡腦汁。 有人在某處幫助我節儉!

解析器必須嘗試規則op: operator ws ex: exprop:operator ws str:string然后才最終通過op:operator ws成功。 它不知道,那些不工作,直到它未能找到任何超出的)

因此,它一次通過了operator規則,沒有看到另一個表達式,因此它回溯了。 然后,它第二次看到該operator ,但它仍然不起作用,因為它后面沒有字符串。 因此,最后,在第三次嘗試中,它看到了運算符,然后最后一條規則成功了。

之所以調用console.log(7)是因為operator規則本身會成功,即使expr規則不會成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM