用PEG.js忽略空格

Mat*_*ias 19 javascript parsing lexical-analysis peg

我想用我的语法忽略空格新行,因此它们在PEG.js输出中缺失.此外,括号内的文字应该在新数组中返回.

语法

start
  = 'a'? sep+ ('cat'/'dog') sep* '(' sep* stmt_list sep* ')'

stmt_list
  = exp: [a-zA-Z]+ { return new Array(exp.join('')) }

sep
  = [' '\t\r\n]
Run Code Online (Sandbox Code Playgroud)

测试用例

a dog( Harry )
Run Code Online (Sandbox Code Playgroud)

产量

[
   "a",
   [
      " "
   ],
   "dog",
   [],
   "(",
   [
      " "
   ],
   [
       "Harry"
   ],
   [
      " "
   ],
   ")"
]
Run Code Online (Sandbox Code Playgroud)

我想要的输出

[
   "a",
   "dog",
   [
      "Harry"
   ]
]
Run Code Online (Sandbox Code Playgroud)

Poi*_*nty 26

你必须更多地使用更多的"非终端"分解语法(不确定这是否是你在PEG中所称的那些):

start
  = article animal stmt_list

article
  = article:'a'? __ { return article; }

animal
  = animal:('cat'/'dog') _ { return animal; }

stmt_list
  = '(' _ exp:[a-zA-Z]+ _ ')' { return [ exp.join('') ]; }

// optional whitespace
_  = [ \t\r\n]*

// mandatory whitespace
__ = [ \t\r\n]+
Run Code Online (Sandbox Code Playgroud)

谢谢你提出这个问题!

编辑: 为了提高可读性,有两个产品:___

  • 不是`[''\ t\r \n]``而是`[\ t\r \n]`.`[''\ t\r \n]``会抓住''`. (3认同)
  • 至于如何解析`dot`文件,语法很复杂,我认为你需要一个"真正的"解析器.它当然不一定是PEG; 你可以在JavaScript中编写自己的递归下降解析器,或者使用像[Jison](http://zaach.github.com/jison/docs/)这样的东西.我没有PEG解析的经验,但我认为这很有趣.:-) (2认同)