2011-11-24 41 views
20

Tôi muốn bỏ qua khoảng trắngdòng mới với ngữ pháp của tôi để chúng thiếu trong đầu ra PEG.js. Ngoài ra, một chữ trong ngoặc đơn sẽ được trả về trong một mảng mới.Bỏ qua khoảng trống bằng PEG.js

Grammar

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] 

trường hợp thử nghiệm

a dog(Harry) 

Output

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

Output Tôi muốn

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

Trả lời

26

Bạn phải chia tay ngữ pháp hơn, sử dụng nhiều "không bến" (không chắc chắn nếu đó là những gì bạn gọi cho họ trong một 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]+ 

Cảm ơn để đặt câu hỏi này!

Edit: Để tăng khả năng đọc, có hai tác phẩm: ___

+0

Cảm ơn! Chỉ có một điều: Thử 'chó (Harry)'. Bài viết phải là tùy chọn. Đưa '?' Từ ''a'' (trong bài viết) vào' bài viết' (trong phần đầu) sẽ vẫn trả về một chuỗi trống ... Đây có phải là PEG.js liên quan không? – Matthias

+0

Tôi nghĩ rằng có thể làm cho quy tắc "bắt đầu" có "bài viết?" sẽ giúp. Sau đó, chính quy tắc "bài viết" có thể chỉ là ''a' sep *' – Pointy

+0

Sau đó, nó cũng sẽ cho phép 'adog (Harry)'. Dù sao, có lẽ tôi đang sử dụng công cụ sai ... Tôi havin một xdot [ngữ pháp] (http://www.graphviz.org/content/dot-language) (xdot dựa trên dấu chấm) mà tôi muốn phân tích cú pháp và vẽ lên canvas. Bạn có biết về bất kỳ cách tiếp cận tiết kiệm thời gian nào khác đánh giá ngữ pháp của tệp (ngoại trừ viết trình phân tích cú pháp của riêng tôi hay sử dụng thigs như [canviz] (http://code.google.com/p/canviz/) (không đủ chức năng)))? – Matthias

Các vấn đề liên quan