2012-09-01 9 views
7

私はpegjsを使ってパーサを作ろうとしています。これをペグ文法でどのように解析するのですか?

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で繰り返しが貪欲であるため、ENDだけでなく、START用負の述語を使用する必要があります。ネストされた配列を扱う場合、これはjoinのない、必ずしも文書化挙動に依存しているが、代替的に、アクションは

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

のように書くことができる

は(それがコンマでサブアレイに参加した後、連結、すなわちことそれら)。

[UPDATE]空要素に対処するための短い方法は

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

感謝です! !!!!!!!!! –

関連する問題