2011-11-24 105 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