Символы, соответствующие нескольким правилам лексера в 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 и ASTERISK соответствуют /, "и * соответственно.Поскольку они помещены (непреднамеренно) перед моими комментариями и правилами строковых литералов, которые также соответствуют / * и ", я ожидаю, что правила для комментариев и строковых литералов будут отключены (непреднамеренно). Но, к удивлению, правила ML_COMMENT, SL_COMMENT и STRING_LITERAL по-прежнему работают правильно.

Это несколько сбивает с толку. Разве это не /, является ли он частью / * или просто автономным /, всегда будет сопоставляться и потребляться IGNORED_SYMBOLS в первую очередь, прежде чем у него появится возможность сопоставить ML_COMMENT?

Каким образом лексический анализатор решает, какие правила применять, если символы соответствуют более чем одному правилу?

6
задан JavaMan 24 September 2011 в 12:53
поделиться