SparkSQL-Antl4编译器学习

ANTLR4规则解析生成器(一):入门 ANTLR是ANother Tool for Language Recognition的缩写,它是一个强大的用于读取、处理、执行和翻译结构化文本或二进制文件的语法分析器生成器,广泛用于构建语言、工具和框架,通过语法描述规则,它能够生成一个可以遍历解析树的解析器。ANTLR4是ANTLR的第4个版本。 阅读详情

前期知识

编译器基本知识:
编译:将高级语言翻译成汇编语言或者机器语言的过程; 高级语言为源语言,汇编语言为目标语言。
编译器结构

ANTLR简介

官网地址:https://www.antlr.org/

What is ANTLR?
ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It’s widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser that can build and walk parse trees.
ANTLR是开源的语法解析器生成器,距今已有30多年的历史。是一个经历了时间考验的开源项目。一个程序从源代码到机器可执行,基本需要3个阶段:编写、编译、执行。
在编译阶段,需要进行词法和语法的分析。ANTLR聚焦的问题就是把源码进行词法和句法分析,产生一个树状的分析器。ANTLR几乎支持对所有主流编程语言的解析。从antlr/grammars-v4可以看到,ANTLR支持Java,C, Python, SQL等数十种编程语言。通常我们没有扩展编程语言的需求,所以大部分情况下这些语言编译支持更多是供学习研究使用,或者用在各种开发工具(NetBeans、Intellij)中用于校验语法正确性、和格式化代码。

ANTLR实现四则运算例子

  • 基于需求按照ANTLR4的规则编写自定义语法的语义规则, 保存成以g4为后缀的文件。
grammar Calculator; //表示文件是一个词法,语法混合的文件。名称必须和文件名字相同


//语法单元以小写字母开发

line: expr EOF;
expr: '(' expr ')'         # parenExpr  //# 是产生式标签,起到标记不同规则
    | expr ('*'|'/') expr  # multOrDiv
    | expr ('+'|'-') expr  # addOrSubtract
    | FLOAT                # float;

//词法单元以大写字母开头
WS: [ \t\n\r]+ ->skip ;    //词法规则  ->skip 是antlr4的特殊命令,表示跳过不做任何处理
FLOAT:DIGIT + '.' DIGIT*EXPONENT?
     |'.' DIGIT+EXPONENT?
     | DIGIT+EXPONENT? ;
fragment DIGIT : '0'..'9';   // '0'..'9'  表示0~9的字符
fragment EXPONENT :('e'+'E') ('+'+'-')? DIGIT+;  //fragment 词片段的问题 不会生成对应的token
  • Idea 安装使用ANTLR4工具插件处理g4文件,生成词法分析器、句法分析器代码、词典文件。
    在这里插入图片描述!
  • 实现visitor接口编写对应标签处理逻辑
public class MyCalculatorVisitor extends CalculatorBaseVisitor<Object> {
    @Override
    public Object visitAddOrSubtract(CalculatorParser.AddOrSubtractContext ctx) {
        Object accept = ctx.expr(0).accept(this);
        Object accept1 = ctx.expr(1).accept(this);
        if ("+".equals(ctx.getChild(1).getText())){
            return  (Float)accept +(Float)accept1;
        }else if ("-".equals(ctx.getChild(1).getText())){
            return  (Float)accept - (Float)accept1;
        }
        return  0f;
    }

}
  • 编写驱动入口类执行
public class Driver {
    public static void main(String[] args) {

        String query = "1+2";
        //对字符串 构造一个ANTLRStrean
        ANTLRInputStream input = new ANTLRInputStream(query);
        //构造词法解析器         词法解析器  将字符 聚集成单词或者符号
        CalculatorLexer calculatorLexer = new CalculatorLexer(input);

        //  用词法分析器 构造 一个记号流
        CommonTokenStream    tokens =     new CommonTokenStream(calculatorLexer);
        // 再使用 tokens 构造语法分析器 parser,至此已经完成词法分析和语法分析的准备工作
        CalculatorParser parser = new CalculatorParser(tokens);
        MyCalculatorVisitor myCalculatorVisitor = new MyCalculatorVisitor();
        Object accept = parser.expr().accept(myCalculatorVisitor);
        System.out.println(accept);

    }
}

ANTLR开发语言类应用

设计语法

从编程语言中的范例代码提取语法

  • 前期概念
    • 编写语法:处理语言规则。ANTLR 会为每条规则生成一个函数。
    • 语法由一个该语法命名的头部定义和一系列可以相互引用的语言规则组成。
如何建立初始语法框架?
  • 定义: 语言结构辨识从最粗粒度开始,一直进行到最详细层次,并把他们编写称为语法规则。
  • 步骤
  1. 编写伪代码
    1. 找到最粗粒度的语言结构作为起始规则。
    2. 设计起始规则内容就是 使用 “英语伪代码” 来描述输入的文本结构。例子:一个CSV文件就是一系列以换行符为终止的行( a comma-separated-value[CSV] is a sequence of rows terminated by newlines);
    3. 下一层级,描述起始规则右侧所指定的那些元素( sequence of rows terminated by newlines)。由词法符号或者未定义的规则组成
    - 定义:
    - 词法符号:大脑能够轻易识别的出的单词,标点符号或者运算符。
    - 规则: row is a sequence of fields sparated by commas
    4. 再降低层: a field is number or string
grammar Mg; //伪代码
file: <<sequence of  rows  terminated by  newlines>> // 
row:<< a row is a sequence of fields sparated  by commas  >>
field: <<a field is  number or string >>
  1. 将伪代码翻译为ANTLR 标记,得到正常工作语法
    • 基本概念:语言模式
      1. 序列模式:由 指令(关键字)、一个操作数和一个换行符构成。
      2. 选择模式:使用 | 符号表达编程语言中的选择模式
      3. 词法符号依赖模式
      4. 嵌套模式:嵌套词组是一种自相似的语言结构,即它子词组遵循相同的结构
grammar Mg; //伪代码
//+字符处理一个或多个的情况。
//*字符处理零个或多个的情况。
//特殊的零个或者一个元素的序列 , (‘=’expr)?,在有无之间选择
file:  (row  '\n')* ;//  以\n为终止符的 序列  
row: field (',' field)*  ; // 以‘,’为分隔符的 序列
field:  INT|STRING;   // 字段可以为整数或者字符串  通过| 选择模式
vector: '[' INT+ ']'  // [1] [2 3]  词法符号依赖模式
stat: 'while' '(' expr ')'  stat //匹配WHILE语句
			| '{' stat* '}'  //匹配花括号中若干条语句 嵌套模式
  1. 识别常见的语法结构
    ANTLR 文件允许词法规则和语法规则放入一个文件。词法文件以大写字母开头,文法文件以小写字母开头。
    展示词法规则:
    1. 匹配标识符

ID:( ‘a’… ‘z’)|(‘A’…‘Z’)+ //匹配一个或多个大小写字母
ID:[a-zA-Z]+ ; 匹配一个或多个大小写字母

219. 使用ANTLR构建解析器 ANTLR(Another Tool for Language Recognition)是一个功能强大的解析器生成工具,广泛用于构建语言解析器、编译器前端和解释器。它能根据用户定义的语法规则自动生成词法分析器和语法分析器,支持多种目标语言(如Java、Python、C++等)。ANTLR 4采用LL(*)解析算法,可处理复杂语法和左递归,并提供可视化调试工具。其典型应用包括:开发领域特定语言(DSL)、配置文件解析、代码转换、静态分析以及自然语言处理等基础功能。ANTLR简化了语言处理流程,使开发者能专注于 阅读详情

相关推荐

编译原理Antlr教程

BIT编译原理 Antlr教程

weixin_43877853的博客 7567

Antlr入门指南:从基础到应用

Antlr

道 1万+

ANTLR4基础入门与实践:构建简单解析器

ANTLR4(Another Tool for Language Recognition, 第四版)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它常用于编程语言的编译器和解释器的开发,也能处理各种计算机语言的语法分析任务,例如SQL查询、数据格式解析、脚本语言的实现等。了解ANTLR4语法文件是掌握这个强大的工具的基础。ANTLR4语法文件是一个定义输入文本语法和构造分析器的脚本。

weixin_34779181的博客 2411

解析器生成器 ANTLR的详细介绍

ANTLR诞生的背景是,当时的语言工具包大多数都是基于YACC和LEX等老旧技术,无法支持新的编程语言和复杂的语法规则,同时,它们的性能和可扩展性也受到一定的限制。根据SQL语句的各个部分和解析结果,我们可以记录和分析SQL执行情况,包括执行的时间、执行的参数、执行的结果等信息。解析输入的SQL语句。另外,在自然语言处理领域中,还有许多其他的类似ANTLR的语言工具,例如Stanford Parser、NLTK、SpaCy等,它们都能够用于自然语言文本的处理和分析,提高自然语言处理的效率和准确性。

G探险者的博客 4998

IAR9.X半主模式异常解析:为何硬件复位后仍陷调试状态?

本文深入解析了IAR 9.X半主模式异常问题,探讨了硬件复位后MCU仍陷调试状态的原因及解决方案。通过分析半主模式工作机制,提供了禁用半主功能、重写低级IO函数等具体方法,并给出了版本兼容性处理和调试与量产配置分离的优化建议,帮助开发者有效解决复位异常问题。

oo7890的博客 605

详细推导波特图增益和相位曲线

文章来源:https://mp.weixin.qq.com/s/UCy9mRRok5Hc9qHq3qde5g 今天这篇文章想把近段时间关于波特图方面学习的内容整理一下。波特图将会是梳理闭环控制这个系列的开始。目前的计划是,以无源器件为基础,然后结合运放,再过渡到开关电源的环路控制方面。如果对这方面感兴趣的朋友,可以持续一起学习起来,目标就是掌握开关电源的闭环控制。 1. 什么是波特图? 波特图最常见的应用是在线性非时变的系统中,用于对传递函数的增益和相位进行分析,从而判断出系统随频率的响应是否稳定。因此,波

ltqdxl的博客 2万+

Antl4 访问者模式返回对象

最近在实时数仓,基本的流程图如下: 我们采用 antl4 来进行 mysql 的解析,从效率上来说,解析速度确实有点慢,但简单易于上手,MySqlLexer.g4 和 MySqlParser.g4 都是开源的,所以就可以直接拿来用了。 在这个过程当中遇到了一个问题: antl4 如何返回对象?看到 antl4资料有点少,特地记一下。 我们都知道,antl4 要想返回值需要采用 visitor 模式...

shengjk1的博客 667

Ansys Lumerical 启动时出现 Error: Could not connect to Ansys license server specified at 1055@ 的另一种解决办法

昨天在关闭了中之后 就能正常打开 FDTD 了,结果今天想开启出现了同样的报错:我猜测昨天能启动的原因在于关闭之后要重启电脑,并且在重启之后我第一时间打开 lumerical 测试因此端口没有被占用,今天是在电脑启动之后一段时间才打开所以又遇到了端口占用的问题。

qq_51404184的博客 9549

Antlr---词法解析器的使用【转】

1 ANTLR简介 ANTLR—A, 其前身是PCCTS,它为包括Java,C++,C#在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(recognizer),编译器 (parser)和解释器(translator)的框架。ANTLR可以通过断言(Predicate)解决识别冲突;支持动作(Action)和返回 值(Return Value)来;更棒的是,它可以根据输入...

weixin_30767921的博客 130

硅光芯片边耦合器综述(一)

摘要:硅光子学在过去几十年间吸引了越来越多的关注,由于其具有诸多优点,如极低的成本、硅的高折射率带来的高集成密度,以及与现有半导体制造工艺的兼容性,被认为是未来日常应用中的一项充满前景的关键技术。在硅光子集成电路中,光互连是一个重要的问题,而在数据中心和光传输系统等应用场景中,光纤到芯片的光互连至关重要。光纤到芯片的光学耦合主要分为两大类:面外耦合(off-plane coupling)和面内耦合(in-plane coupling)。光栅耦合器属于前者,而边耦合器则属于面内耦合。本文主要关注硅光子集成电路

jhbfsoagoodgio的博客 5041

QT 实现QStackedWidget切换页面右移动画

首先截取当前界面的图片,渲染到一个QLabel上,然后设置QPropertyAnimation动画,动画的作用对象就是这个QLabel,不断的改变geometry;当动画结束的时候,隐藏并释放这个QLabel。以下是一个QStackedWidget,放了两个QPushButton在上面,点击切换不同的界面。为了方便查看动画特效,设置了每个界面的背景图片。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 882

ANTLR4入门【打造你自己的语法规则】

antlr4学习,结合idea使用,java代码实现一个带括号的四则运算规则

qq_33129875的博客 1万+

YOLO26涨点改进 | 小目标损失函数独家改进篇 | TGRS 2025 | 引入AdaFocalLoss损失函数,改进小目标检测,自适应聚焦小目标与样本分布不平衡,提升检测精度与训练稳定性

本文提出将AdaFocalLoss损失函数应用于YOLO26模型优化,有效提升小目标检测性能。AdaFocalLoss通过目标尺寸感知机制和IoU引导的动态调节,自动调整训练权重和聚焦程度,解决了样本不平衡问题。相比传统损失函数,它无需手动调参,能增强训练稳定性,在多尺度、复杂场景下表现优异。文章详细介绍了AdaFocalLoss的原理、优势及实现方法,并提供了代码集成指南。实验表明该方法能显著提升检测精度和鲁棒性,特别适用于小目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 337

Antlr4 快速入门 - 编写语法解析器

Antlr全称(ANother Tool for Language Recognition),Antlr4是一款强大的语法分析器生成工具,推特,Haddop,Oracle等各大知名公司在用到了Antlr来构建自己的语言处理类项目。一门语言的正式描述称为语法(grammar),Antlr可以为语言生成一个词法分析器,并且自动建立语法分析树,也能自动生成树的遍历器,然后我们就可以访问树的节点,执行自定义业务逻辑代码。本文主要是介绍Antlr4的使用,因此不过多的介绍其特性和各种使用方式,以简单的Demo来了解下

BASK2312的博客 6568

maxim max96712+max96717调试笔记

mxxim max96712 和max96717调试笔记

libuping2023的博客 1万+

在jetson上对fastdeploy进行源码编译(完整版)

在大多数Linux发行版中,你可以使用包管理器安装Python开发包。根据jetpack的版本选择对应的推理库版本。在~/.bashrc中写入这三行。

如果想成为中心,那么就到中心去吧。 678

antlr4 简单实用入门——(一)

Antlr4 简介 简介 Antlr4 是一款强大的语法生成器工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。基本上是当前 Java 语言中使用最为广泛的语法生成器工具。Twitter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询;Hadoop生态系统中的Hive、Pig、数据仓库和分析系统所使用的语言都用到了ANTLR;Lex Machina将ANTLR用于分析法律文本;Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR;NetBeans公司的IDE使用ANTLR来

诸葛子房的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ANTLR实战

ANTLR(Another Tool for Language Recognition)是目前非常活跃的语法生成工具,用Java语言编写,基于LL(∗)解析方式,使用自上而下的递归下降分析方法。ANTLR可以用来产生词法分析器、语法分析器和树状分析器(Tree Parser)等各个模块,其文法定义使用类似EBNF(Extended Backus-Naur Form)的方式,简洁直观。ANTLR本身使用switch-case逻辑来匹配字符(Token),形成记号序列流。

RainTicking的博客 1538

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Antlr4 怎么用

(1)定义.g4语法文件;(2)使用 ANTLR 4 工具,生成词法分析器(Lexer)和语法分析器(Parser)目标编程语言代码(3)遍历 AST(抽象语法树):访问者模式(Visitor)和监听器模式(Listener)

weixin_45755222的博客 4088

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

使用 Antlr 开发领域语言

Antlr 简介 ANTLR 语言识别的一个工具 (ANother Tool for Language Recognition ) 是一种语言工具,它提供了一个框架,可以通过包含 Java, C++, 或 C# 动作(action)的语法描述来构造语言识别器,编译器和解释器。 计算机语言的解析已经变成了一种非常普遍的工作,在这方面的理论和工具经过近 40 年的发展已经相当成熟,使用 An

Google Oriented Programmer 2531

ANTLR学习(二):ANTLR入门项目

文章目录前言一、项目简介二、ANTLR工具、运行库以及自动生成的代码三、将生成的语法分析器与Java程序集成四、构建一个语言类应用程序 前言 通过一个入门项目学习到: 一些ANTLR语法的语义元素定义 ANTLR根据语法自动生成代码的机制 如何讲自动生成的语法分析器和Java程序集成 如何使用语法分析树监听器辨析一个代码翻译工具 一、项目简介 构造一个语法,它为C语言或其继承者Java语法的一个很小的自己,我们将识别包括花括号或者嵌套的花括号的一些整数,例如 {1,2,3}和{1,{2,3},4}

weixin_52224421的博客 3320

你知道antlr是什么吗?

ANTLR,全称为 Another Tool for Language Recognition,是一种用于语言识别的开源语法分析器。它可以根据输入的文本自动生成语法树,并可视化的显示出来。ANTLR的前身是PCCTS,它为包括Java,C++,C#在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(recognizer),编译器(parser)和解释器(translator)的框架。

qq_41826150的博客 1645

Antlr的使用

本篇介绍了Antlr 的核心功能、工作流程,在 Idea 中Antlr插件的安装。并通过示例,介绍了 Antlr 的使用。

JingAi_jia917的博客 2200

ANTLR4入门(三):使用maven ANTLR4插件(antlr4-maven-plugin)执行语法解析生成器

在上篇博客,我费半天劲装好了Eclise的AntlrIDE插件,简单的创建一个ANTLR 4 工程,感受了一下AntlrIDE插件提供的语法高亮的便利性。及语法文件(.g4)自动生成解析器代码的过程然而热乎劲儿过后,我发现这个插件对于入门学习或许有用,但在基于maven构建的工程开发中实用性并不大,除了语法高亮比较方便外。在maven管理的项目中,项目编译可以在命令行进行并不一定依赖Eclipse等IDE环境。

10km的专栏 7080

ANTLR4 学习(一):ANTLR4安装

文章目录前言一、ANTLR4的下载二、环境变量配置1.在系统变量中配置CLASSPATH2、配置文件3、检查4、测试 前言 本篇博客主要内同为ANTLR4的安装与Hello的操作示例,需要注意的是,必须要先在环境中安装好java,并且正确配置环境变量 一、ANTLR4的下载 下载在官网中即可下载 官网:https://www.antlr.org 点击即可下载一个jar包,下载完成。 二、环境变量配置 1.在系统变量中配置CLASSPATH 将下载好的jar包放在一个你喜欢的目录中,将这个jar包的路

weixin_52224421的博客 3783

ANTLR4详细介绍(一)windows环境下的安装配置

Antlr 是一款强大的语法生成器工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件,也是目前Java领域最流行的语法解析工具,Hibernate、Hive、ShardingSphere等众多框架都能看到它的影子。Antlr支持多种语言:Java、C、C++、Python、Javascript,同一套语法规则可以通过多种语言来实现。本系列将以Java作为描述语言来介绍antlr的安装和环境配置。

kebin2012的博客 2986
上一篇: shell脚本练习目录文件大小复制文件到别处
下一篇: 设计模式之简单工厂模式
keepHungery
博客等级 码龄8年 115粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值