2012-09-01 31 views
7

Próbuję utworzyć parser za pomocą pegjs. Muszę analizować coś takiego:Jak analizować to z gramatyką peg?

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

Mam problem pisania regułę złapać tekst z "START" do "END".

Odpowiedz

10

Stosować predykaty ujemny uprzedzona:

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(""); 
    } 

Trzeba użyć negatywny orzecznik dla końcowych, jak również uruchomić z powodu powtarzania w pegjs jest chciwy.

Alternatywnie, działanie może być zapisany jako

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

Chociaż ta opiera się na nie-koniecznie udokumentowanego zachowania join gdy ma do czynienia z zagnieżdżonych tablic (to znaczy, że łączy podrzędnych tablice z przecinkami, a następnie skleja im).

[UPDATE] Krótsza droga do czynienia z pustych elementów jest

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

Dzięki! !!!!!!!!! –