antlr v4 使用指南连载4——词法规则入门之黄金定律
词法规则入门#
黄金定律一二
- 若输入串能被多个词法规则匹配,那么声明在词法文件最前面的规则生效。
parser
parser grammar HelloParser;
options {
language=Java;
tokenVocab=HelloLexer;
}
start : HI ID;
lexer例1
lexer grammar HelloLexer; //Definea grammar called Hello
ID : [a-zA-Z]+;
HI : 'H' 'I';
WS : [\t\r\n ]+->skip; //skip spaces,tabs,newlines,\r(Windows)
lexer例2
lexer grammar HelloLexer; //Definea grammar called Hello
HI : 'H' 'I';
ID : [a-zA-Z]+;
WS : [\t\r\n ]+->skip; //skip spaces,tabs,newlines,\r(Windows)
当输入串为HI antlr时,对于语法规则start,只有使用例2的词法文件时,才能匹配成功。原因在于,这两个例子中,HI可以被词法规则HI、ID匹配。对于例1,输入串HI,被词法ID优先匹配,antlr也被ID词法匹配,所以无法匹配语法规则start : HI ID;。对于例2,输入串HI,被词法HI优先匹配,antlr被ID词法匹配。
- 输入串将被最长匹配的词法规则匹配。下面用一个稍微复杂一点的例子来说明,本来可以不用例子,一句话也能说明白。比如ABCD肯定会被能完全匹配ABCD的词法规则匹配,而不是将ABCD拆开分别被匹配,例如被两个词法ABC、D匹配。
parser
parser grammar HelloParser;
options {
language=Java;
tokenVocab=HelloLexer;
}
numeric_literal : INTEGER | NUMERIC;
lexer
//lexer
lexer grammar HelloLexer; //Definea grammar called Hello
ZERO : '0';
DOT : '.';
UNDERLINE : '_';
HI : 'H' 'I';
fragment
DIGIT : [0-9];
INTEGER : ZERO|[1-9] DIGIT*;
NUMERIC : INTEGER DOT DIGIT+;
ALPHABET : [a-zA-Z];
ID : (ALPHABET|UNDERLINE) (DIGIT|ALPHABET|UNDERLINE)+;
WS : [\t\r\n ]+->skip; //skip spaces,tabs,newlines,\r(Windows)
对于输入串12.03,只会被NUMERIC词法匹配,而不会被拆成12、.、0、3分别被INTEGER、DOT、INTEGER、INTEGER匹配。这就是最长匹配原则,也叫贪婪匹配。
未完待续>>>
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· Tinyfox 简易教程-1:Hello World!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!