Apache Pig从ANTLR3迁移至ANTLR4:QueryLexer.g中IDENTIFIER定义解析
Apache Pig QueryLexer.g中IDENTIFIER规则解析
规则核心含义
这段是Apache Pig基于ANTLR3实现的词法规则,定义了**标识符(IDENTIFIER)**的匹配逻辑,同时包含特殊的词后处理逻辑:
IDENTIFIER @after { if("null".equalsIgnoreCase(getText())){ state.type = NULL; } } : ( ID DCOLON ) => ( ID DCOLON IDENTIFIER ) | ID
1. @after 词后处理逻辑
- 这是ANTLR3的词法钩子,在成功匹配
IDENTIFIER后执行 - 作用:如果匹配到的文本忽略大小写等于
null,就将当前词法符号的类型强制改为NULL——把原本会被识别为普通标识符的null/NULL/Null这类字符串,转为关键字NULL。
2. 标识符匹配分支(ANTLR3语法预测)
( ID DCOLON ) =>是ANTLR3的前瞻谓词,用来判断输入流当前位置的前缀:- 若前缀是
ID(基础标识符单元) +DCOLON(双冒号::的词法符号),则走第一个分支:ID DCOLON IDENTIFIER,匹配带命名空间的嵌套标识符,比如ns::table、db::ns::col这种递归结构 - 否则走第二个分支:
ID,匹配普通单个标识符,比如user_name、age这类
- 若前缀是
迁移到ANTLR4的注意事项
ANTLR4语法和ANTLR3有差异,对应调整点:
- 移除了ANTLR3的前瞻谓词写法,直接用递归规则即可实现嵌套命名空间标识符的匹配
@after动作没有直接对应,可通过两种方式实现null转关键字:- 优先定义
NULL关键字规则(ANTLR4会优先匹配更早定义的规则) - 在词法分析完成后,通过监听器/访问器修改符号类型
- 优先定义
内容的提问来源于stack exchange,提问作者Mark Rostron
相关产品推荐
相关产品推荐

