大写字母开头的单词是词法规则(Lexer Rule),小写字母开头的单词是文法规则。
匹配标识符
ID : ('a'..'z' | 'A'..'Z' )+ ; // 匹配1个或多个大写、小写字母
或者
ID : [a-zA-Z]+ ; // 匹配1个或多个大写、小写字母
上面的规则也会匹配enum或for这样的关键字,所以ANTLR按出现的先后顺序来解析规则。实际上,ANTLR会自动将词法规则放在文法规则之后。
grammar KeywordTest ;
enumDef : 'enum' '{' ... '}' ;
FOR : 'for' ;
ID : [a-zA-Z]+ ; // 不会匹配'enum'和'for'
匹配数字
INT : [0-9]+ ; //匹配1个或多个数字
匹配浮点数(没有包括科学计数法),这里面的fragment是为了书写方便。
FLOAT : DIGIT+ '.' DIGIT*
| '.' DIGIT+
;
fragment
DIGIT : [0-9] ; //辅助规则,匹配单个数字
匹配字符串常量
STRING : '"' .*? '"' ; //匹配双引号包围的文本
这里使用了正则表达式的非贪婪匹配的用法。
支持转义符号,ANTLR本身也使用转义字符,所以会看见大量的反斜杠:
STRING : '"' (ESC|.)*? '"' ;
fragment
ESC : '\\"' | '\\\\' ;
匹配注释和空白字符
匹配C语言里的单行注释和多行注释。
LINE_COMMENT : '//' .*? '\r'? '\n' -> skip ;
COMMENT : '/*' .*? '*/' -> skip ;
丢弃空白符:
WS : [ \t\r\n]+ -> skip ;