2012-10-05 56 views
5

Estoy intentando escribir una gramática simple para PEG.js que se correspondería con algo como esto:problema con el extremo de entrada de PEG.js

some text; 
arbitrary other text that can also have µnicode; different expression; 
let's escape the \; semicolon, and \not recognized escapes are not a problem; 
possibly last expression not ending with semicolon 

Así que, básicamente, estos son algunos de los textos separados por punto y coma. Mi gramática simplificada se ve así:

start 
= flow:Flow 

Flow 
= instructions:Instruction* 

Instruction 
= Empty/Text 

TextCharacter 
= "\\;"/
. 

Text 
= text:TextCharacter+ ';' {return text.join('')} 

Empty 
= Semicolon 

Semicolon "semicolon" 
= ';' 

El problema es que si pongo que no sea un punto y coma nada en la entrada, me sale:

SyntaxError: Expected ";", "\\;" or any character but end of input found. 

cómo solucionar esto? He leído que PEG.js no puede hacer coincidir el final de la entrada.

+4

FWIW, puede hacer coincidir el final de la entrada con '! .' – ebohlman

Respuesta

8

que tiene (al menos) 2 problemas:

Su TextCharacter debe no coincide con cualquier carácter (el .). Debe coincidir con cualquier carácter excepto una barra invertida y el punto y coma, o debe coincidir con un carácter de escape:

TextCharacter 
= [^\\;] 
/"\\" . 

El segundo problema es que su gramática ordena su entrada a terminar con un punto y coma (pero su entrada hace no terminará con un ;).

¿Qué tal algo como esto en su lugar:

start 
= instructions 

instructions 
= instruction (";" instruction)* ";"? 

instruction 
= chars:char+ {return chars.join("").trim();} 

char 
= [^\\;] 
/"\\" c:. {return ""+c;} 

que analizar la entrada de la siguiente manera:

[ 
    "some text", 
    [ 
     [ 
     ";", 
     "arbitrary other text that can also have µnicode" 
     ], 
     [ 
     ";", 
     "different expression" 
     ], 
     [ 
     ";", 
     "let's escape the ; semicolon, and not recognized escapes are not a problem" 
     ], 
     [ 
     ";", 
     "possibly last expression not ending with semicolon" 
     ] 
    ] 
] 

Tenga en cuenta que la arrastra punto y coma es opcional ahora.

Cuestiones relacionadas