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',<ID>,1:0]        //@0表示 hello 位于第1个位置 字符索引范围是0:4,1行0位置
[@1,6:10='world',<ID>,1:6]     //world 位于第2个位置 字符索引范围是6:10,1行6位置
[@2,12:13='hi',<ID>,1:12]       //hi 位于第3个位置 字符索引范围是12:13,1行12位置
[@3,15:14='<EOF>',<EOF>,2:0] //EOF 位于第4个位置 字符索引范围是15:14,2行0位置
line 1:0 missing 'hello_word' at 'hello'

还可以增加 -tree参数以LISP的格式打印语法分析树

grun HelloWorld r -tokens -tree

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/748295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在idea中配置tomcat服务器,部署一个项目(下载教程加链接)

第一步&#xff1a;把Tomcat下载好 ww​​​​​​​Apache Tomcat - Welcome! 链接如上&#xff1a;进去后在左边找到Tomcat8点击进去后 找到图下内容 第二步&#xff1a; 打开这个文件点击bin进去 会出现一个黑色框框&#xff0c;也就是服务器 完成后就可以在浏览器输入…

【C++】实现红黑树

目录 一、认识红黑树1.1 概念1.2 定义 二、实现红黑树2.1 插入2.2 与AVL树对比 一、认识红黑树 1.1 概念 红黑树是一个二叉搜索树&#xff0c;与AVL树相比&#xff0c;红黑树不再使用平衡因子来控制树的左右子树高度差&#xff0c;而是用颜色来控制平衡&#xff0c;颜色为红色…

Keil笔记(缘更)

Keil 一、使用Keil时可能会出现的问题1.Project框不见了2.添加文件时找不到3.交换文件位置4.main.c测试报1 warning 二、STLINK点灯操作1.配置寄存器进行点灯2.使用库函数进行点灯 3.GPIO1.LED闪烁 一、使用Keil时可能会出现的问题 1.Project框不见了 view->Project Windo…

Naive Ui Admin:企业级中后台项目开箱即用框架/让你少写一些代码

欢迎加入我们的前端组件学习交流群&#xff0c;可添加群主微信&#xff0c;审核通过后入群。 Naive Ui Admin&#xff1a;企业级中后台项目开箱即用框架/让你少写一些代码 在数字化时代&#xff0c;中后台系统对于企业的运营至关重要。然而&#xff0c;构建这样的系统往往需要…

Unity URP 如何写基础的曲面细分着色器

左边是默认Cube在网格模式下经过曲面细分的结果&#xff0c;右边是原状态。 曲面细分着色器在顶点着色器、几何着色器之后&#xff0c;像素着色器之前。 它的作用时根据配置信息生成额外的顶点以切割原本的面片。 关于这部分有一个详细的英文教程&#xff0c;感兴趣可以看一…

AtomoVideo:AIGC赋能下的电商视频动效生成

✍&#x1f3fb; 本文作者&#xff1a;凌潼、依竹、桅桔、逾溪 1. 概述 当今电商领域&#xff0c;内容营销的形式正日趋多样化&#xff0c;视频内容以其生动鲜明的视觉体验和迅捷高效的信息传播能力&#xff0c;为商家创造了新的机遇。消费者对视频内容的偏好驱动了视频创意供给…

Redis部署方式(三)主从模式

在前面单机版的基础上&#xff0c;41为主&#xff0c;30为从。 一、主从搭建 1、主Redis安装 41机器redis主要配置 requirepass redis#!_41 bind 0.0.0.0 port 6379 daemonize yes 2、从redis安装 30机器redis主要配置 requirepass redis#!_30 bind 0.0.0.0 port 6380 da…

python 如何使用 NLPchina 开源sql插件,提供代码

分享一段使用python&#xff0c;通过使用发送post请求的方式&#xff0c;来从es集群中获取数据。不用使用 elasticsearh&#xff0c;仅需要导入request和json包即可。 开源sql插件官方 文档 GitHub - NLPchina/elasticsearch-sql: Use SQL to query Elasticsearch 示例代码 调…

JavaScript中的事件模型(详细案例代码)

文章目录 一、事件与事件流二、事件模型原始事件模型特性 标准事件模型特性 IE事件模型 一、事件与事件流 javascript中的事件&#xff0c;可以理解就是在HTML文档或者浏览器中发生的一种交互操作&#xff0c;使得网页具备互动性&#xff0c; 常见的有加载事件、鼠标事件、自定…

js实现扫描线填色算法使用canvas展示

算法原理 扫描线填色算法的基本思想是&#xff1a;用水平扫描线从上到下扫描由点线段构成的多段构成的多边形。每根扫描线与多边形各边产生一系列交点。将这些交点按照x坐标进行分类&#xff0c;将分类后的交点成对取出&#xff0c;作为两个端点&#xff0c;以所填的色彩画水平…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《适应分布式资源渗透率提高的配电网网元规划方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【QT 5 +Linux下qt软件点击.sh脚本运行+Dconf编辑器+学习他人文章+番外篇:点击脚本运行软件】

【QT 5 Linux下qt软件点击.sh脚本运行Dconf编辑器学习他人文章番外篇&#xff1a;点击脚本运行软件】 1、前言2、实验环境3、自我学习总结-本篇总结1、说明&#xff1a;代替qt的快捷方式2、适用性更广3、了解工具&#xff1a;Dconf编辑器注意事项&#xff1a; 4、参考链接-感谢…

PCM和I2S区别

I2S和PCM接口都是数字音频接口&#xff0c;而所见的蓝牙到cpu以及codec的音频接口都是用PCM接口&#xff0c;是不是两个接口有各自不同的应用呢&#xff1f;先来看下概念。 PCM&#xff08;PCM-clock、PCM-sync、PCM-in、PCM-out&#xff09;脉冲编码调制&#xff0c;模拟语音信…

基础:TCP是什么?

1. TCP 是什么&#xff1f; TCP&#xff08;Transmission Control Protocol 传输控制协议&#xff09; 是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由IETF的RFC 793 [1]定义。 TCP旨在适应支持多网络应用的分层协议层次结构。连接到不同但互连的计算机…

如何成为一名优秀的硬件工程师

求知若饥&#xff0c;大智如愚&#xff0c;这是乔布斯说的&#xff0c;很多工程师把这句话作为工程师的最基本的职业素养。 “工程师是科学家&#xff1b;工程师是艺术家&#xff1b;工程师也是思想家。”实际上&#xff0c;工程师是利用自然科学来创造工程的人。工程既是物质…

Docker容器化技术(使用Dockerfile制作镜像)

Docker中的镜像分层 Docker 支持通过扩展现有镜像&#xff0c;创建新的镜像。实际上&#xff0c;Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。 1、Docker 镜像为什么分层 镜像分层最大的一个好处就是共享资源。 比如说有多个镜像都从相…

智慧城市:提升城市治理能力的关键

目录 一、智慧城市的概念及特点 二、智慧城市在提升城市治理能力中的应用实践 1、智慧交通&#xff1a;提高交通治理效率 2、智慧政务&#xff1a;提升政府服务水平 3、智慧环保&#xff1a;加强环境监测与治理 4、智慧安防&#xff1a;提高城市安全水平 三、智慧城市在…

【PythonCode】力扣Leetcode6~10题Python版

【PythonCode】力扣Leetcode6~10题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台&#xff0c;很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题&#xff0c;可以选择各种主流的编程语言&#xff0c;如C、…

我的尝试:Codigger + Vim

若您愿意耐心投入&#xff0c;学习 Vim 的过程其实远比想象中轻松。我对 Vim 产生兴趣&#xff0c;主要是源于它对提升生产力的巨大潜力。我尝试了 Neovim、NvChad 以及 Codigger Vim 插件&#xff0c;如今我的工作效率已远超从前。 那么&#xff0c;Vim 究竟是什么呢&#xff…

【调参】如何为神经网络选择最合适的学习率lr-LRFinder-for-Keras

【调参】如何为神经网络选择最合适的学习率lr-LRFinder-for-Keras_学习率选择-CSDN博客文章浏览阅读9.2k次&#xff0c;点赞6次&#xff0c;收藏55次。keras 版本的LRFinder&#xff0c;借鉴 fast.ai Deep Learning course。前言学习率lr在神经网络中是最难调的全局参数&#x…