2011-11-24 12 views
20

quiero ignorar espacios en blanco y nuevas líneas con mi gramática por lo que se están perdiendo en la salida PEG.js. Además, un literal entre paréntesis debe ser devuelto en una nueva matriz.Ignorar espacios en blanco con PEG.js

Gramática

start 
    = 'a'? sep+ ('cat'/'dog') sep* '(' sep* stmt_list sep* ')' 

stmt_list 
    = exp: [a-zA-Z]+ { return new Array(exp.join('')) } 

sep 
    = [' '\t\r\n] 

caso de prueba

a dog(Harry) 

salida

[ 
    "a", 
    [ 
     " " 
    ], 
    "dog", 
    [], 
    "(", 
    [ 
     " " 
    ], 
    [ 
     "Harry" 
    ], 
    [ 
     " " 
    ], 
    ")" 
] 

Salida quiero

[ 
    "a", 
    "dog", 
    [ 
     "Harry" 
    ] 
] 

Respuesta

26

Hay que romper la gramática más, el uso de más "no terminales" (no estoy seguro si eso es lo que usted le llama en un PEG):

start 
    = article animal stmt_list 

article 
    = article:'a'? __ { return article; } 

animal 
    = animal:('cat'/'dog') _ { return animal; } 

stmt_list 
    = '(' _ exp:[a-zA-Z]+ _ ')' { return [ exp.join('') ]; } 

// optional whitespace 
_ = [ \t\r\n]* 

// mandatory whitespace 
__ = [ \t\r\n]+ 

Gracias por hacer esta pregunta!

Editar: Para aumentar la legibilidad, tienen dos producciones: _ y __

+0

Gracias! Solo hay una cosa: prueba 'perro (Harry)'. El artículo debe ser opcional. Traer el '?' De ''a'' (en el artículo) a' artículo' (en el inicio) todavía devolverá una cadena vacía ... ¿Está relacionado este PEG.js? – Matthias

+0

Creo que tal vez la regla de "inicio" tiene "artículo". ayudaría. Entonces, la regla del "artículo" en sí misma podría ser simplemente '' a 'sep * ' – Pointy

+0

Luego también permitiría' adog (Harry) '. De todos modos, tal vez estoy usando la herramienta incorrecta ... Tengo una xdot [gramática] (http://www.graphviz.org/content/dot-language) (xdot se basa en el punto) que quiero analizar y dibujar a un lienzo. ¿Conoces algún otro método de ahorro de tiempo que evalúe la gramática del archivo (excepto escribir mi propio analizador o usar thigs como [canviz] (http://code.google.com/p/canviz/) (funcionalidad insuficiente)))? – Matthias

Cuestiones relacionadas