Я определил несколько правил лексера, которые потенциально соответствуют одной и той же последовательности символов. Например:
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?
Как лексер решает, какие правила применять, если символы соответствуют более чем одному правилу?