2011-11-24 19 views
20

chcę ignorować spacje i nowe linie z moim gramatyki tak tracą na wyjściu PEG.js. Ponadto literał w nawiasach powinien zostać zwrócony w nowej tablicy.Ignoruj ​​spacje z PEG.js

Gramatyka

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] 

przypadek testowy

a dog(Harry) 

Wyjście

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

Wyjście chcę

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

Odpowiedz

26

Trzeba zerwać gramatykę więcej, używając więcej "non-terminale" (nie wiem, czy to, co nazywasz je w 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]+ 

Thanks za zadanie tego pytania!

Edit: Aby zwiększyć czytelność, mają dwie produkcje: _ i __

+0

Dzięki! Jest tylko jedna rzecz: spróbuj 'pies (Harry)'. Artykuł powinien być opcjonalny. Przeniesienie '?' Z ''a'' (w artykule) do' article' (na początku) będzie nadal zwracać pusty ciąg ... Czy ten plik PEG.js jest powiązany? – Matthias

+0

Myślę, że być może wprowadzenie reguły "startu" ma "artykuł?" mogłoby pomóc. Wtedy sama reguła "artykułu" mogłaby być po prostu '' a 'sep * ' – Pointy

+0

Wtedy też zezwoliłoby na' adog (Harry) '. W każdym razie, może używam niewłaściwego narzędzia ... Jestem havin a xdot [gramatyka] (http://www.graphviz.org/content/dot-language) (xdot jest oparty na kropce), który chcę sparsować i narysuj na płótnie. Czy znasz inne, oszczędzające czas podejście oceniające gramatykę pliku (z wyjątkiem pisania własnego parsera lub używania thigów takich jak [canviz] (http://code.google.com/p/canviz/) (niewystarczająca funkcjonalność))? – Matthias