2011-09-24 71 views
5

Tôi đã xác định nhiều quy tắc lexer có khả năng khớp với cùng chuỗi ký tự. Ví dụ:Ký tự khớp với nhiều quy tắc Lexer trong ANTLR

LBRACE: '{' ; 
RBRACE: '}' ; 
LPARENT: '(' ; 
RPARENT: ')' ; 
LBRACKET: '[' ; 
RBRACKET: ']' ; 
SEMICOLON: ';' ; 
ASTERISK: '*' ; 
AMPERSAND: '&' ; 

IGNORED_SYMBOLS: ('!' | '#' | '%' | '^' | '-' | '+' | '=' | 
        '\\'| '|' | ':' | '"' | '\''| '<' | '>' | ',' | '.' |'?' | '/' ) ; 


// WS comments***************************** 
WS: (' '|'\n'| '\r'|'\t'|'\f')+ {$channel=HIDDEN;}; 
ML_COMMENT: '/*' .* '*/' {$channel=HIDDEN;}; 
SL_COMMENT: '//' .* '\r'? '\n' {$channel=HIDDEN;}; 

STRING_LITERAL: '"' (STR_ESC | ~('"'))* '"'; 
fragment STR_ESC: '\\' '"' ; 

CHAR_LITERAL : '\'' (CH_ESC | ~('\'')) '\'' ; 
fragment CH_ESC : '\\' '\''; 

IGNORED_SYMBOLS tôi và Asterisk trận đấu/"và * tương ứng Kể từ khi chúng được đặt (vô tình) trước khi bình luận và chuỗi chữ của tôi quy tắc đó cũng phù hợp với/* và" Tôi hy vọng những nhận xét và các quy tắc chữ theo chuỗi sẽ bị vô hiệu hóa (vô ý). Nhưng chính xác, các quy tắc ML_COMMENT, SL_COMMENT và STRING_LITERAL vẫn hoạt động chính xác.

Điều này hơi khó hiểu. Không phải là một /, cho dù đó là một phần của/* hoặc chỉ là một độc lập /, sẽ luôn luôn được kết hợp và tiêu thụ bởi IGNORED_SYMBOLS đầu tiên trước khi nó có bất kỳ cơ hội để được kết hợp bởi ML_COMMENT?

Cách người quyết định áp dụng quy tắc nào nếu các ký tự khớp với nhiều quy tắc?

Trả lời

4

Cách mà người từ chối quyết định áp dụng quy tắc nào nếu các ký tự khớp với nhiều quy tắc?

Quy tắc Lexer được đối sánh từ trên xuống dưới. Trong trường hợp hai (hoặc nhiều) quy tắc khớp với cùng một số ký tự, thì một quy tắc được xác định trước tiên được ưu tiên hơn một (các) quy tắc sau được định nghĩa trong ngữ pháp. Trong trường hợp quy tắc khớp với số N số ký tự và quy tắc sau phù hợp với cùng một số Ncộng 1 hoặc nhiều ký tự, thì quy tắc sau được khớp (kết hợp tham lam).

Đi các quy tắc sau ví dụ:

DO : 'do'; 
ID : 'a'..'z'+; 

Các đầu vào "do" rõ ràng sẽ được xuất hiện bởi sự cai trị DO.

Và đầu vào như: "done" sẽ khớp với tham số ID. Đó là không được mã hóa là 2 mã thông báo: [DO:"do"], sau đó là [ID:"ne"].

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