【问题标题】:Characters Matching Multiple Lexer Rules in ANTLRANTLR 中匹配多个 Lexer 规则的字符
【发布时间】: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 匹配和消费?

如果字符匹配多个规则,词法分析器如何决定应用哪些规则?

【问题讨论】:

    标签: parsing antlr lexer


    【解决方案1】:

    如果字符匹配多个规则,词法分析器如何决定应用哪些规则?

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

    以以下规则为例:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多