Antlr4 ---词法规则

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangguosb/article/details/85624640

规则存放位置

 词法规则既可以和语法规则写在同一个文件{xxx}.g4,也可以单独放在词法规则文件{xxx}Lexer.g4;

匹配原则

  1. 最长匹配原则: 输入串将被最长匹配的词法规则匹配;
  2. 优先声明原则: 若输入串能同时被多个词法规则匹配,那么声明在词法文件最前面的规则生效;

解析内容

 词法规则作用是将一个个字符按照定义的规则聚集成字符,主要有以下四类:

  1. 标识符: 即各类编程语言中的变量名;
  2. 常量值: 英文叫Literal,如数字、单引号字符串、双引号字符串、各个进制写法等;
  3. 操作符: 单字符(!、~、=、>等)、双字符(>=、<=)等;
  4. 关键字: 即编程语言中的关键字,如Java中的class、package、import、public等;

可选项说明

  1. Fragment 共用的词法片段,供多个词法规则使用,一个词法规则中可引用一个或多个词法片段;
  2. {action} 词法规则关联的目标语言代码。当输入串被词法规则匹配时,执行定义的action;
  3. mode 主要用于解决一个语法中包含一个或多个其他不同的语法;
  4. hidden channel 将不需要关注的如注释、空格等发送到隐藏通道中,当需要的时候通过调用Antlr的api获取;

参考样例

  XMLLexer.g4的词法规则如下:

/** XML lexer derived from ANTLR v4 ref guide book example */
lexer grammar XMLLexer;

// Default "mode": Everything OUTSIDE of a tag
COMMENT     :   '<!--' .*? '-->' ;
CDATA       :   '<![CDATA[' .*? ']]>' ;
/** Scarf all DTD stuff, Entity Declarations like <!ENTITY ...>,
 *  and Notation Declarations <!NOTATION ...>
 */
DTD         :   '<!' .*? '>'            -> skip ;
EntityRef   :   '&' Name ';' ;
CharRef     :   '&#' DIGIT+ ';'
            |   '&#x' HEXDIGIT+ ';'
            ;
SEA_WS      :   (' '|'\t'|'\r'? '\n')+ ;

OPEN        :   '<'                     -> pushMode(INSIDE) ;
XMLDeclOpen :   '<?xml' S               -> pushMode(INSIDE) ;
SPECIAL_OPEN:   '<?' Name               -> more, pushMode(PROC_INSTR) ;

TEXT        :   ~[<&]+ ;        // match any 16 bit char other than < and &

// ----------------- Everything INSIDE of a tag ---------------------
mode INSIDE;

CLOSE       :   '>'                     -> popMode ;
SPECIAL_CLOSE:  '?>'                    -> popMode ; // close <?xml...?>
SLASH_CLOSE :   '/>'                    -> popMode ;
SLASH       :   '/' ;
EQUALS      :   '=' ;
STRING      :   '"' ~[<"]* '"'
            |   '\'' ~[<']* '\''
            ;
Name        :   NameStartChar NameChar* ;
S           :   [ \t\r\n]               -> skip ;

fragment
HEXDIGIT    :   [a-fA-F0-9] ;

fragment
DIGIT       :   [0-9] ;

fragment
NameChar    :   NameStartChar
            |   '-' | '_' | '.' | DIGIT
            |   '\u00B7'
            |   '\u0300'..'\u036F'
            |   '\u203F'..'\u2040'
            ;

fragment
NameStartChar
            :   [:a-zA-Z]
            |   '\u2070'..'\u218F'
            |   '\u2C00'..'\u2FEF'
            |   '\u3001'..'\uD7FF'
            |   '\uF900'..'\uFDCF'
            |   '\uFDF0'..'\uFFFD'
            ;

// ----------------- Handle <? ... ?> ---------------------
mode PROC_INSTR;

PI          :   '?>'                    -> popMode ; // close <?...?>
IGNORE      :   .                       -> more ;

参考:

  1. https://www.cnblogs.com/laud/p/anltrv4_5.html
  2. XML词法规则:https://github.com/antlr/grammars-v4/blob/master/xml/XMLLexer.g4

猜你喜欢

转载自blog.csdn.net/yangguosb/article/details/85624640
今日推荐