2012-09-01 27 views
7

我正在嘗試使用pegjs來製作解析器。我需要分析是這樣的:如何用peg語法解析此問題?

blah blah START Lorem ipsum 
dolor sit amet, consectetur 
adipiscing elit END foo bar 
etc. 

我有麻煩寫規則文本趕上從"START""END"

回答

10

使用負先行斷言:

phrase 
    =(!"START" .)* "START" result:(!"END" .)* "END" .* { 
    for (var i=0;i<result.length;++i) 
     // remove empty element added by predicate matching 
     {result[i]=result[i][1]; 
     } 
    return result.join(""); 
    } 

您需要使用爲最終否定謂語以及啓動,因爲重複的pegjs是貪婪。

另外,動作可以寫成

{return result.join("").split(',').join("");} 

雖然與嵌套數組打交道時(即它加入子陣列用逗號,然後連接此依賴於join未不一定記錄的行爲他們)。

[更新]對付空元素更短的方法是

phrase 
    =(!"START" .)* "START" result:(t:(!"END" .){return t[1];})* "END" .* { 
     return result.join(""); 
    } 
+0

謝謝! !!!!!!!!! –