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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java微服务轻松部署服务器

我们在日常开发微服务之后需要再服务器上面部署&#xff0c;那么如何进行部署呢&#xff0c;先把微服务的各个服务和中间件以及对应的端口列举出来&#xff0c;都打包成镜像&#xff0c;以及前端代码部署的nginx&#xff0c;使用docker-compose启动&#xff0c;访问服务器nginx…

linux板子vscode gdb 远程调试

板子&#xff1a;hi3556v200 交叉编译工具&#xff1a;arm-himix200-linux 主机&#xff1a;win10虚拟机的ubuntu16.4 gdb:gdb-8.2.tar.gz 1.在ubuntu交叉编译gdb&#xff08;Remote g packet reply is too long解决&#xff09; 建议修改gdb8.2/gdb目录下面的remote.c解决…

16.WEB渗透测试--Kali Linux(四)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;15.WEB渗透测试--Kali Linux&#xff08;三&#xff09;-CSDN博客 1.crunch简介与使用 C…

docker实战(3)

1, jdk17版本的dockerfile FROM eclipse-temurin:17-jre ADD ./target/ods-poc-0.0.1-SNAPSHOT.jar /home/app/app.jar WORKDIR /home/app ENV TZ Asia/Shanghai ENTRYPOINT ["java","-jar","/home/app/app.jar"] EXPOSE 8083dockerfile 1, …

神策分析 Copilot 成功通过网信办算法备案,数据分析 AI 化全面落地

近日&#xff0c;神策数据严格遵循《互联网信息服务深度合成管理规定》&#xff0c;已完成智能数据问答算法备案。该算法基于大模型技术&#xff0c;专注于为客户提供数据指标查询和数据洞察方面的专业回答。 神策分析 Copilot 运用神策数据智能数据问答算法&#xff0c;聚焦分…

uni app 打肉肉(打飞机)小游戏

都给老婆和孩子写了 合十 钓鱼了&#xff0c;给自己写个打飞机吧。没找飞机怪兽的图片。就用馒头和肉肉代替了。有问题不要私信我。自己改哈 <template><view class"page_main"><view class"contentone"><canvas class"canvas…

【Session】Tomcat Session 集群

设备 nginx&#xff1a;192.168.67.11 tomcat1&#xff1a;192.168.67.12 tomcat2&#xff1a;192.168.67.13安装nginx &#xff08;192.168.67.11&#xff09; #关闭防火墙和安全机制 [roottest1 ~]# systemctl stop firewalld [roottest1 ~]# setenforce 0#安装epel源 [ro…

iOS面试题锦集

1. 问&#xff1a;一张图片所占内存大小跟什么有关&#xff1f; 图片所占内存大小&#xff0c;与图片的宽高有关 我们平时看到的png、jpg、webp这些图片格式&#xff0c;其实都是图片压缩格式。通过对应的算法来优化了大小以节省网络传输与本地保存所需的资源。 但是当我们加…

【四 (1)数据可视化之如何选用正确的图表】

目录 文章导航一、数据分析中可视化的作用1、揭示数据关联和模式2、支持数据分析和决策3、提升沟通和共享效果4、强调关键信息和发现5、增强故事叙述和记忆效果6、有效增强数据交互性数据7、复杂信息易理解8、数据多维度显示 二、如何选用合适的图表1、简洁性避免使用过于复杂或…

【PTA】​L1-034 点赞(C++)

题目链接&#xff1a; L1-034 点赞 - 团体程序设计天梯赛-练习集 (pintia.cn) 目录&#xff1a; 目录&#xff1a; 题目要求&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 思路&#xff1a; 代码&#xff1a; 测试结果…

git下载及基础

git学习教程&#xff1a;【【GeekHour】一小时Git教程】 https://www.bilibili.com/video/BV1HM411377j/?share_sourcecopy_web&vd_source1a32dd27a726236a74603cf06b7302aa 1. 下载 官网&#xff1a;https://git-scm.com/ 终端输入 git -v 能看到版本信息表示安装成功…

最新开源解密版TwoNav网址导航系统源码

源码简介 2024最新开源解密版TwoNav网址导航系统源码去授权破解版 内置二十多套主题模板。 已去授权&#xff0c;最新开源解密版。TwoNav 是一款开源的书签&#xff08;导航&#xff09;管理程序&#xff0c;使用PHP SQLite 3开发&#xff0c;界面简洁&#xff0c;安装简单&…

【MySQL】4. 表的操作

表的操作 1. 创建表 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明&#xff1a; field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c…

springcloud:4.1 GateWay

概述 Gateway 简介 Spring Cloud Gateway基于Spring 5.0、SpringBoot 2.0和Project Reactor等技术开发 旨在为微服务架构提供一种简单有效的、统一的API路由管理方式&#xff0c;并为微服务架构提供安全、监控、指标和弹性等功能 其目标是替代Zuul特点 易于编写谓词和过滤器&…

1.2 课程架构介绍:STM32H5 芯片生命周期管理与安全调试

1.2 课程架构介绍&#xff1a;STM32H5 芯片生命周期管理与安全调试 下面开始学习课程的第二节&#xff0c;简单介绍下STM32H5芯片的生命周期和安全调试&#xff0c;具体课程大家可以观看STM32官方录制的课程&#xff0c;链接&#xff1a;1.2. 课程架构介绍&#xff1a;STM32H5…

免费阅读篇 | 芒果YOLOv8改进109:注意力机制SimAM:用于卷积神经网络的简单、无参数注意力模块

免费阅读篇|芒果YOLOv8改进109&#xff1a;注意力机制篇SimAM&#xff1a;用于卷积神经网络的简单、无参数注意力模块 &#x1f4a1;&#x1f680;&#x1f680;&#x1f680;本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 该专栏完整目录链接&#x…

【AIGC调研系列】通义灵码与copilot的对比

通义灵码与GitHub Copilot的对比主要集中在几个方面&#xff1a;代码编写能力、免费性、操作界面和适配性。 首先&#xff0c;在代码编写能力上&#xff0c;虽然GitHub Copilot在整体上要强于通义灵码&#xff0c;但通义灵码的能力也不算弱&#xff0c;并且在某些特定的小类任…

外卖平台订餐流程架构的实践

当我们想要在外卖平台上订餐时&#xff0c;背后其实涉及到复杂的技术架构和流程设计。本文将就外卖平台订餐流程的架构进行介绍&#xff0c;并探讨其中涉及的关键技术和流程。 ## 第一步&#xff1a;用户端体验 用户通过手机应用或网页访问外卖平台&#xff0c;浏览菜单、选择…

服务器遭遇挖矿病毒syst3md及其伪装者rcu-sched:原因、症状与解决方案

01 什么是挖矿病毒 挖矿病毒通常是恶意软件的一种&#xff0c;它会在受感染的系统上无授权地挖掘加密货币。关于"syst3md"&#xff0c;是一种特定的挖矿病毒&#xff0c;它通过在受感染的Linux系统中执行一系列复杂操作来达到其目的。这些操作包括使用curl从网络下载…

stm32-定时器输出比较PWM

目录 一、输出比较简介 二、PWM简介 三、输出比较模式实现 1.输出比较框图(以通用定时器为例) 2.PWM基本结构 四、固件库实现 1.程序1&#xff1a;PWM呼吸灯 2.程序2&#xff1a;PWM驱动直流电机 3.程序3&#xff1a;控制舵机 一、输出比较简介 死区生成和互补输出一般…