2012-09-01 25 views

risposta

10

Utilizzare i predicati lookahead negativo:

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

È necessario utilizzare un predicato negativo per la fine così come START perché la ripetizione in pegjs è avido.

In alternativa, l'azione potrebbe essere scritta come

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

Sebbene questo si basa sul comportamento non-necessariamente documentata di join quando si tratta di matrici nidificate (cioè che unisce i sottocampi con virgole e poi concatena loro).

[UPDATE] Un modo più breve per affrontare gli elementi vuoti è

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

Grazie! !!!!!!!!! –