Hive-技术补充-初识ANTLR

一、背景

要清晰的理解一条Hql是如何编译成MapReduce任务的,就必须要学习ANTLR。下面是ANTLR的官方网址,下面让我们一起来跟着官网学习吧,在学习的过程中我参考了《antlr4权威指南》,你也可以读下这本书,一定会对你有所帮助。

https://www.antlr.org/

二、ANTLR是什么

ANTL是由谷歌的技术负责人Terence Parr研发的,他之前是旧金山大学的数据科学/计算机科学教授。

ANTLR(ANother Tool for Language Recognition)是一个强大的语法分析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它被广泛用于构建语言、工具和框架。根据语法,ANTLR生成了一个可以构建和遍历解析树的解析器。

Hive、Pig、Oracle的 IDE及其迁移工具、NetBeans IDE、Hibernate中都使用到了ANTLR。

ANTLR是java世界实现编译器的不二之选

回想下你用java、c++、python等等语言编写的程序是怎么让计算机运行的,

比如c:

编写源文件xxx.c ----预处理--->xxx.i---编译--->xxx.s---汇编--->xxx.o---链接--->可执行文件

比如java:

编写源文件xxx.java---编译--->字节码文件xxx.class---解释--->---运行--->

你会发现它们都需要经过编译阶段,我们只需要按照每种语言的语法编写即可,那么编译器都做了什么呢?

扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化

Hive中的hql是一种语言,也需要被编译分析,而ANTLR就是来做这件事情的

三、安装ANTLR

1、安装jdk

比较简单,我的这篇博客<CDH6.3.1离线安装>中有涉及

2、下载ANTLR

https://www.antlr.org/download/antlr-4.13.1-complete.jar

把jar包放到/usr/local/lib下并配置环境变量

vi /etc/profile

export CLASSPATH=".:/usr/local/lib/antlr-4.13.1-complete.jar"

source /etc/profile

注意,该版本的ANTLR的class版本是55.0,对应要安装jdk11

3、验证是否正常

4、做个别名

vi ~/.bash_profile

alias antlr4='java -jar /usr/local/lib/antlr-4.13.1-complete.jar'

source ~/.bash_profile

四、ANTLR的hello world

1、编写语法规则文件

vi HelloWorld.g4

grammar HelloWorld; //定义一个名为HelloWord的语法

r :'helloworld' ID; //匹配一个关键词hello_word和一个紧随其后的标识符

ID :[a-z]+; //匹配小写字母组成的标识符

WS :[ \t\r\n]+ -> skip; //或略空格、Tab、换行符

2、生成词法分析器和语法分析器

antlr4 HelloWorld.g4

先编译生成的java文件

javac *.java

HelloWorldLexer.java 和 HelloWorldParser.java 组成了可以运行的语法识别程序,不过我们还缺少一个main方法来触发这个程序,幸运的是ANTLR为我们提供了一个TestRig的调试程序,它使用java的反射机制来调用编译后的识别程序。为了方便使用,我们给它起个别名

vi ~/.bash_profile

alias grun='java org.antlr.v4.runtime.misc.TestRig'

source ~/.bash_profile

3、测试词法分析器和语法分析器

grun HelloWorld r -tokens

grun HelloWorld r -tokens //使用HelloWorld和r规则启动TestRig

hello world hi //输入要识别的语句 输入EOF或者linux按Ctrl+D结束

//以下都是grun的输出的词法符号列表

@0,0:4='hello',\,1:0\] //@0表示 hello 位于第1个位置 字符索引范围是0:4,1行0位置 \[@1,6:10='world',\,1:6\] //world 位于第2个位置 字符索引范围是6:10,1行6位置 \[@2,12:13='hi',\,1:12\] //hi 位于第3个位置 字符索引范围是12:13,1行12位置 \[@3,15:14='\',\,2:0\] //EOF 位于第4个位置 字符索引范围是15:14,2行0位置 line 1:0 missing 'hello_word' at 'hello' 还可以增加 -tree参数以LISP的格式打印语法分析树 grun HelloWorld r -tokens -tree ![](https://file.jishuzhan.net/article/1769588185647550465/7c68c6b2c8b4c3011843b8ef3981574b.webp)

相关推荐
tsyjjOvO7 小时前
SpringMVC 从入门到精通
数据仓库·hive·hadoop
Francek Chen12 小时前
【大数据存储与管理】分布式数据库HBase:05 HBase运行机制
大数据·数据库·hadoop·分布式·hdfs·hbase
zzzzzwbetter12 小时前
Hadoop完全分布式部署-Master的NameNode以及Slaver2的DataNode未启动
大数据·hadoop·分布式
weixin_4493108414 小时前
ETL转换和数据写入小满OKKICRM的技术细节
数据仓库·php·etl
IvanCodes15 小时前
Hive IDE连接及UDF实战
ide·hive·hadoop
yumgpkpm16 小时前
华为昇腾910B 开源软件GPUStack的介绍(Cloudera CDH、CDP)
人工智能·hadoop·elasticsearch·flink·kafka·企业微信·big data
lifewange1 天前
Hive数据库
数据库·hive·hadoop
五月天的尾巴3 天前
hive数据库模糊查询表名
hive·查询表名
蓝魔Y3 天前
hive—1.1、执行优化
hive
快乐非自愿3 天前
OpenClaw 生态适配:Hadoop/Hive 技能现状与企业级集成方案
大数据·hive·hadoop·分布式·openclaw