在ANTLR中匹配多个Lexer规则的字符

时间:2011-09-24 12:47:22

标签: parsing antlr lexer

我已经定义了多个可能匹配相同字符序列的词法规则。例如:

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匹配和使用?

如果字符匹配多个规则,词法分析器决定应用哪些规则的方式是什么?

1 个答案:

答案 0 :(得分:6)

  

如果字符匹配多个规则,词法分析器决定应用哪些规则的方式是什么?

Lexer规则从上到下匹配。如果两个(或更多)规则匹配相同数量的字符,则首先定义的规则优先于语法中稍后定义的规则。如果规则匹配N个字符数且后面的规则匹配相同的N字符加上 1个或更多字符,则匹配后面的规则(贪婪匹配)。

例如,采用以下规则:

DO : 'do';
ID : 'a'..'z'+;

输入"do"显然会与规则DO匹配。

"done"这样的输入会被ID贪婪地匹配。 标记为2个令牌:[DO:"do"]后跟[ID:"ne"]