Я определил несколько правил лексера, которые потенциально соответствуют одной и той же последовательности символов. Например:
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 и ASTERISK соответствуют /, "и * соответственно.Поскольку они помещены (непреднамеренно) перед моими комментариями и правилами строковых литералов, которые также соответствуют / * и ", я ожидаю, что правила для комментариев и строковых литералов будут отключены (непреднамеренно). Но, к удивлению, правила ML_COMMENT, SL_COMMENT и STRING_LITERAL по-прежнему работают правильно.
Это несколько сбивает с толку. Разве это не /, является ли он частью / * или просто автономным /, всегда будет сопоставляться и потребляться IGNORED_SYMBOLS в первую очередь, прежде чем у него появится возможность сопоставить ML_COMMENT?
Каким образом лексический анализатор решает, какие правила применять, если символы соответствуют более чем одному правилу?