2012-10-05 48 views
5

Tôi cố gắng để viết một ngữ pháp đơn giản cho PEG.js rằng sẽ phù hợp với một cái gì đó như thế này:Rắc rối với PEG.js cuối đầu vào

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 

Vì vậy, về cơ bản đây là một số văn bản phân cách bằng dấu chấm phẩy. ngữ pháp đơn giản của tôi trông như thế này:

start 
= flow:Flow 

Flow 
= instructions:Instruction* 

Instruction 
= Empty/Text 

TextCharacter 
= "\\;"/
. 

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

Empty 
= Semicolon 

Semicolon "semicolon" 
= ';' 

Vấn đề là rằng nếu tôi đặt bất cứ điều gì khác hơn là một dấu chấm phẩy trong đầu vào, tôi nhận được:

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

Làm thế nào để giải quyết này? Tôi đã đọc rằng PEG.js không thể khớp với kết thúc của đầu vào.

+4

FWIW, bạn có thể kết thúc đầu vào bằng '! .' – ebohlman

Trả lời

8

Bạn có (ít nhất) 2 vấn đề:

bạn TextCharacter nên không phù hợp với bất kỳ ký tự (các .). Nó phải phù hợp với bất kỳ ký tự, ngoại trừ một dấu chéo ngược và dấu chấm phẩy, hoặc nó phải phù hợp với một nhân vật tương tự nhau:

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

Vấn đề thứ hai là ngữ pháp của bạn ủy nhiệm đầu vào của bạn để kết thúc với một dấu chấm phẩy (nhưng đầu vào của bạn không không kết thúc bằng số ;).

Làm thế nào về một cái gì đó giống như thay vì điều này:

start 
= instructions 

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

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

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

đó sẽ phân tích đầu vào của bạn như sau:

[ 
    "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" 
     ] 
    ] 
] 

Lưu ý rằng các dấu dấu chấm phẩy là không bắt buộc bây giờ.

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