2011-11-24 140 views
20

我想忽略空格新线与我的语法所以它们在PEG.js输出失踪。另外,括号内的文字应该返回到新的数组中。忽略空格与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] 

测试用例

a dog(Harry) 

输出

[ 
    "a", 
    [ 
     " " 
    ], 
    "dog", 
    [], 
    "(", 
    [ 
     " " 
    ], 
    [ 
     "Harry" 
    ], 
    [ 
     " " 
    ], 
    ")" 
] 

输出我想

[ 
    "a", 
    "dog", 
    [ 
     "Harry" 
    ] 
] 

回答

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

谢谢问这个问题!

编辑: 为了增加可读性,有两个作品:___

+0

谢谢!只有一件事:试试'狗(哈利)'。该文章应该是可选的。将''a''(文章)中的'?'引入'article'(开始时)仍然会返回一个空字符串......这是否与PEG.js有关? – Matthias

+0

我想也许让“开始”规则有“文章?”有助于。然后,“文章”规则本身可能只是'''sep *' – Pointy

+0

然后它也允许'adog(Harry)'。无论如何,也许我正在使用错误的工具......我有一个xdot [语法](http://www.graphviz.org/content/dot-language)(xdot基于点),我想解析和画到画布。你知道还有其他节省时间的方法来评估文件的语法吗(除了编写我自己的解析器或使用[canviz]之类的thigs(http://code.google.com/p/canviz/)(没有足够的功能))? – Matthias