2013-02-14 49 views
9

Tôi có deffinition sau đoạn:ANTLR phù hợp với bất kỳ ký tự trừ

fragment CHAR :'a'..'z'|'A'..'Z'|'\n'|'\t'|'\\'|EOF; 

Bây giờ tôi phải xác định quy tắc lexer cho chuỗi. Tôi đã làm như sau:

STRING : '"'(CHAR)*'"' 

Tuy nhiên trong chuỗi tôi muốn khớp với tất cả các ký tự của tôi ngoại trừ dòng mới '\ n'. Bất kỳ ý tưởng làm thế nào tôi có thể đạt được điều đó?

Trả lời

11

Bạn cũng cần phải loại trừ " ngoài ngắt dòng. Hãy thử điều này:

STRING : '"' ~('\r' | '\n' | '"')* '"' ; 

~ phủ nhận bộ char.

ut Tôi muốn phủ nhận chỉ đường mới từ CHAR tôi thiết

Không có cách nào khác hơn là AFAIK này:

STRING : '"' CHAR_NO_NL* '"' ; 

fragment CHAR_NO_NL : 'a'..'z'|'A'..'Z'|'\t'|'\\'|EOF; 
+0

ok và nơi nào các nhân vật đi trong chuỗi? – Andrey

+0

Vâng xin lỗi tôi mới để antlr ... những gì tôi yêu cầu là: Tôi đã xác định trước chuỗi như một chuỗi các CHAR. Trong deffinition của bạn của STRING tôi không thể nhìn thấy nơi bạn đã đặt CHAR. Vậy chương trình sẽ biết rằng nó sẽ lấy mọi thứ từ CHARS như thế nào ngoại trừ ký tự dòng mới? – Andrey

+0

Có nhưng tôi muốn phủ nhận chỉ dòng mới từ bộ CHAR của tôi .. trong trường hợp của bạn, tôi lấy mọi thứ trừ dòng mới – Andrey