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?