【发布时间】:2011-09-24 12:47:21
【问题描述】:
我已经定义了多个可能匹配相同字符序列的词法分析器规则。例如:
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 规则仍然可以正常工作。
这有点令人困惑。那不是 /,不管它是 /* 的一部分还是只是一个独立的 /,总是会在它有机会被 ML_COMMENT 匹配之前,总是先被 IGNORED_SYMBOLS 匹配和消费?
如果字符匹配多个规则,词法分析器如何决定应用哪些规则?
【问题讨论】: