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