Hive-技术补充-ANTLR词法语法分析

一、背景

要清晰的理解一条Hql是如何编译成MapReduce任务的,就必须要学习ANTLR。下面是ANTLR的官方网址,下面让我们一起来跟着官网学习吧

ANTLR

二、ANTLR元语言

1、启发

静下来想想,一门语言有什么组成,比如我们的中文:

女朋友昨天在厨房给我做了一顿丰盛的晚餐,让我吃得心满意足。

我们先不说这句话的实现难度(╥﹏╥...),单论它有什么组成 

女朋友主语
昨天状语
在厨房状语
给我宾语
做了谓语
一顿定语
丰盛的定语
晚餐宾语
标点符号
让我吃得补语
心满意足补语
标点符号

可能对于我们成年人来说很很容易理解他们,因为我们已经学习并轻松的掌握它了,如果一个幼儿园的小朋友呢?

要想理解里面的意思,就必须对其中的词组和标点符号进行正确的拆分归类。

因此,语言是由一系列有意义的语句组成,而语句又是由词组成,词组又由更小的子词组、标点符号组成,再往细的说每个字都由拼音中的字母组成。

计算机语言也是这样。

如果一个程序可以分析或者执行一种计算机语言,我们就称之为解释器

如果一个程序可以将一种计算机语言翻译成另外一种计算机语言,我们就称之为翻译器,也称编译器。

计算机语言也是有类似我们中文这样的规则,也就是语法,ANTLR语法本身又遵循了一种专门用来描述其他语言的语法,我们称之为ANTLR元语言

到这里有没有感觉它很强大,它给了你一种创造语言的能力

三、词法分析器

思考以下,我们是如何听到一句话而后理解它的,我们拆分下。

我们先听到了一个一个音,而后组成了一个一个词,而后组成了一个一个句子,最终我们听到了一句完整的话。

还有,我们脑子里已经学习并具备了把多个音组成词,把词组成句子,并理解该句子的场景含义的规则。

编译器收到我们编写计算机语言也是类似的,需要读取每个二进制、组成字符、组成单词或符号、组成一个声明或一个赋值或一个函数。

这个过程就是词法分析

ANTLR中将符号或词法符号称为token,把实现这个词法分析的程序称为词法分析器lexer。

词法符号有两部分信息:
    1、类型
    2、对应的文本

词法分析器可以将这些词法符号进行归类,例如INT(整数)、ID(标识符)、FLOAT(浮点数)等。

四、语法分析器

这里我们先介绍一个名词:语法分析树

它是一个经过语法规则解析后将每个词存储形成的一个树形数据结构,方便语法分析器可以将最原始的语言通过树形结构传递给下一个程序,与其每个过程都解析下字符流,不如将字符流形成语法分析树,方便各个过程的多次访问和遍历

词法分析器处理字符序列并将生成的词法符号提供给语法分析器,语法分析器随即根据这些信息检查语法的正确性并建造一棵语法分析树。

下面我们看下在建立语法分析树的过程中使用了ANTLR的哪些数据结构和类名。

CharStream、Lexer、Token、Parser,以及ParseTree

ParseTree 的子类 RuleNode 和 TerminalNode 二者分别是树的根节点和叶子节点

子树的根节点的类型实际上是 StatContext AssignContext 以及 ExprContext  他们被成为上下文对象 

连接词法分析器和语法分析器的管道是 TokenStream 

语法分析树的叶子节点仅仅是存放词法符号流中的词法符号的容器。每个词法符号都记录着自己在字符序列中的开始位置、结束位置,而非保存子字符串的拷贝。其中不存在空白字符串对应的词法符号

五、语法分析器的监听器和访问器

语法分析器已经生成了语法分析树,接着就需要使用它,使用语法分析树的方式有两种:

监听器器 和 访问器

1、监听器----内建的遍历器

为了遍历树时触发的事件转化为监听器的调用,ANTLR 提供了 ParseTree-Walker 类

ANTLR 会为每个语法文件生成一个ParseTreeListener的子类,在该类中,每条规则都有对应的enter() 和 exit()

例如当遍历器访问 assign 规则对应的节点时,就会调用 enterAssign() 然后将对应语法分析树节点 AssignContext 实例当作参数传递给它

在遍历器访问了 assign 节点的全部节点后 调用 exitAssign() ,如图所示:组虚线标识了对语法分析树进行深度优先遍历的过程

下图展示了一条赋值语句生成的语法分析树中,ParseTree-Walker 对监听器方法调用的完整过程

使用监听器的好处就是,我们不需要再编写遍历语法分析树的代码,这一切都是自动进行的

2、访问器---访问者模式

在命令行中加入 -visitor 选项可以指示 ANTLR 为一个语法生成访问器接口 ,语法中的每条规则对应接口中的一个 visit() 

public class HelloWorldParser extends Parser {

    //......省略......
     public static class RContext extends ParserRuleContext {
        
        //......省略......
        @Override
        public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
            if ( visitor instanceof HelloWorldVisitor ) {
                return ((HelloWorldVisitor<? extends T>)visitor).visitR(this);
            }else{
                return visitor.visitChildren(this);
            }
        }
        //......省略......

    }

    //......省略......

}
//这个接口为{@link HelloWorldParser}生成的解析树定义了一个完整的通用访问者。
public interface HelloWorldVisitor<T> extends ParseTreeVisitor<T> {

    //访问{@link HelloWorldParser#r}生成的解析树
    T visitR(HelloWorldParser.RContext ctx);

}
//这个类提供了{@link HelloWorldVisitor}的一个空实现,
//可以扩展它来创建一个只需要处理可用方法子集的访问者
public class HelloWorldBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements HelloWorldVisitor<T> {

    //默认实现返回对{@code-ctx}调用{@link#visitChildren}的结果
    @Override
    public T visitR(HelloWorldParser.RContext ctx) { return visitChildren(ctx); }
}

下面是使用常见的访问者模式对我们的语法分析树进行操作的过程

粗虚线显示了对语法分析树进行深度优先遍历的过程

细虚线标示出访问器方法的调用顺序,我们可以在自己的程序代码中实现这个访问器接口,然后调用 visit() 来开始对语法分析树的一次遍历

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

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

相关文章

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+GTX 8b/10b编解码SFP光口传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI…

基于Logstash的动态表同步方案

文章目录 引言I 动态表的同步1.1 利用数据库函数进行动态表名拼接1.2 利用shell脚步进行动态日期表名拼接1.3 方案小结II 增量同步III 同步多数据表引言 基于Logstash由SQLServer向Elasticsearch同步数据,兼容SQL Server 2005,在连接数据库时,url后面加上一个encrypt=false或…

【Mysql数据库基础02】单行函数、排序

单行函数、排序 1 单行函数1.1 常用函数1.1.1 length 字符串的长度1.1.2 ifnull 判断表达式是否为空 1.2 字符函数1.2.1 substr 提取自串1.2.2 转换大小写1.2.3 instr 返回起始索引1.2.4 trim 去除两端指定字符1.2.5 lpad 左填充指定长度 1.3 数学函数1.3.1 round 四舍五入1.3.…

Vue.js中使用Web Workers来创建一个秒表

在Vue.js中使用Web Workers来创建一个秒表应用可以提高性能&#xff0c;因为Web Workers可以在后台线程中运行&#xff0c;不阻塞主线程。下面是一个简单的Vue.js秒表应用的示例&#xff0c;该应用使用Web Worker来执行计时功能。 首先&#xff0c;我们创建一个Web Worker文件…

【iOS】——Blocks

文章目录 前言一、Blocks概要1.什么是Blocks 二、Block模式1.block语法2.block类型变量3.截获自动变量值4._Block修饰符5.截获的自动变量 三、Blocks的实现1.Block的实质2.截获自动变量值3._Block说明符4.Block存储域 前言 一、Blocks概要 1.什么是Blocks Blocks是C语言的扩…

国创证券|超五成私募看好AI成为年度行情主线

3月18日&#xff0c;2024年度全球游戏开发者大会&#xff08;GDC&#xff09;与英伟达GPU&#xff08;图形处理器&#xff09;技能大会&#xff08;GTC&#xff09;举行&#xff0c;出资者关于A股商场的“人工智能”也给予了更多等待。 2月6日至3月15日期间&#xff0c;商场对…

使用 nsenter 排查容器网络问题

需求 我想进入容器中执行 curl 命令探测某个地址的连通性&#xff0c;但是容器镜像里默认没有 curl 命令。我这里是一个内网环境不太方便使用 yum 或者 apt 安装&#xff0c;怎么办&#xff1f; 这个需求比较典型&#xff0c;这里教大家一个简单的方法&#xff0c;使用 nsent…

Linux/Bizness

Enumeration nmap 用 nmap 扫描了常见的端口&#xff0c;发现对外开放了22,80,443 ┌──(kali㉿kali)-[~] └─$ nmap 10.10.11.252 Starting Nmap 7.93 ( https://nmap.org ) at 2024-03-08 01:21 EST Nmap scan report for 10.10.11.252 Host is up (0.36s latency). Not…

H266开源视频编码器VVENC现状

VVenC 是由 Fraunhofer HHI 研究团队开发的&#xff0c;主要是视频编码系统组。HHI 是欧洲最大的研究组织 Fraunhofer 协会的成员&#xff0c;该协会是德国的一个大型非营利性组织。源代码在&#xff1a; https://github.com/fraunhoferhhi/vvenc VVenC几乎与H.266视频标准同时…

什么是VR虚拟现实防火体验馆|VR设备购买|元宇宙文旅

VR虚拟现实防火体验馆是利用虚拟现实&#xff08;VR&#xff09;技术打造的一个模拟火灾场景的体验空间。通过虚拟现实头盔和交互设备&#xff0c;参与者可以在虚拟环境中感受和学习如何正确面对火灾&#xff0c;并进行逃生和自救。 这种虚拟现实防火体验馆通常会模拟真实的火灾…

CPU生产的生命周期 - 回收篇

电子废物的可持续再利用和回收每年变得更加重要。随着技术在全世界范围内变得越来越普及和普及&#xff0c;电子垃圾的产生率也随之直接增加。计算机的心脏是中央处理单元或CPU。我们认为电子废物的许多产品都包含某种处理器。为了保护环境免受日益严重的电子废物堆积问题的影响…

在Termux中安装个人hexo博客并结合cpolar工具实现远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

fn键设置

1、起因&#xff0c;按F7 F8调试&#xff0c;总是执行Fn功能&#xff0c;让人反感。 2、搜索了下对应的型号Fn键设置 方法一&#xff1a;浮岛式键盘Fn热键切换功能 方法二&#xff1a;通过键盘属性设置Fn锁定功能。【方法一解决了我的问题&#xff0c;方法二不试了。】 3、问题…

Windows电脑上如何进行硬盘分区操作!

在Windows操作系统环境下,对电脑硬盘进行分区是一种常见的硬盘管理手段,它可以帮助用户更好地组织和管理存储空间,确保操作系统、应用程序和用户数据各有所属。本文将详细介绍在Windows PC上进行硬盘分区的步骤,适用于Windows 7到Windows 11等不同版本的操作系统。 步骤一:…

SinoDB数据库运行分析

SinoDB数据库运行主要从数据库互斥资源等待、数据库写类型、备份文件有效性、Chunk状态等15个方向进行分析&#xff0c;具体说明如下&#xff1a; 一、数据库互斥资源等待 检查项目 数据库互斥资源等待 检查命令 onstat -g con |head -20 说明 onstat -g con 查看目前数据处…

mysql的学习笔记

干前端好几年了,只会前端总感觉少了条腿,处处不自在,决定今年学习下后端的东西.以前总想着学node会更快,但是实际工作上却用不上. 出来混,总是要还的,该学的javaWeb这一套体系的东西,总是需要学习的. 那就开始啦. 一,在本地电脑mac上安装mysql 这个参考的这篇文章,照着做一次…

Python:filter过滤器

filter() 是 Python 中的一个内置函数&#xff0c;用于过滤序列&#xff0c;过滤掉不符合条件的元素&#xff0c;返回由符合条件元素组成的新列表。该函数接收两个参数&#xff0c;一个是函数&#xff0c;一个是序列&#xff0c;序列的每个元素作为参数传递给函数进行判定&…

Linux——进程通信(二) 匿名管道的应用:进程池

前言 之前我们学习了进程通过匿名管道进行通信&#xff0c;实现了两个进程的数据传输。 如果我们管理的是很多个进程&#xff0c;通过管道发送指令&#xff0c;因为如果管道中没有数据&#xff0c;读端必须等待&#xff0c;也就是被管理的进程们都在等待我发送的指令&#xf…

某东联盟js逆向

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018…

【Web技术应用基础】HTML(2)——文本练习

题目1&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>HTML链接</title><meta name"description" content"HTML链接知识讲解"><meta name"keywords" content&qu…