版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangguosb/article/details/85624640
规则存放位置
词法规则既可以和语法规则写在同一个文件{xxx}.g4,也可以单独放在词法规则文件{xxx}Lexer.g4;
匹配原则
- 最长匹配原则: 输入串将被最长匹配的词法规则匹配;
- 优先声明原则: 若输入串能同时被多个词法规则匹配,那么声明在词法文件最前面的规则生效;
解析内容
词法规则作用是将一个个字符按照定义的规则聚集成字符,主要有以下四类:
- 标识符: 即各类编程语言中的变量名;
- 常量值: 英文叫Literal,如数字、单引号字符串、双引号字符串、各个进制写法等;
- 操作符: 单字符(!、~、=、>等)、双字符(>=、<=)等;
- 关键字: 即编程语言中的关键字,如Java中的class、package、import、public等;
可选项说明
- Fragment 共用的词法片段,供多个词法规则使用,一个词法规则中可引用一个或多个词法片段;
- {action} 词法规则关联的目标语言代码。当输入串被词法规则匹配时,执行定义的action;
- mode 主要用于解决一个语法中包含一个或多个其他不同的语法;
- 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 ;
参考: