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

前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.mzph.cn/pingmian/65291.shtml

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

相关文章

光谱相机与普通相机的区别

一、成像目的 普通相机:主要目的是记录物体的外观形态,生成人眼可见的、直观的二维图像,重点在于还原物体的形状、颜色和纹理等视觉特征,以供人们进行观赏、记录场景或人物等用途。例如,拍摄旅游风景照片、人物肖像等…

TiDB 的MPP架构概述

MPP架构介绍: 如图,TiDB Server 作为协调者,首先 TiDB Server 会把每个TiFlash 拥有的region 会在TiFlash上做交换,让表连接在一个TiFlash上。另外 TiFlash会作为计算节点,每个TiFlash都负责数据交换,表连接…

渗透Vulnhub-Solidstate靶机

本篇文章旨在为网络安全渗透测试行业靶机教学。通过阅读本文,读者将能够对渗透Vulnhub系列Solidstate靶机有定的了解 一、信息收集阶段 靶机官网:https://www.vulnhub.com/entry/solidstate-1%2C261/ 因为靶机为本地部署虚拟机网段,查看dhcp…

ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制

文章目录 Pre概述什么是 composite aggregation?基本结构after 参数的作用问题背景:传统分页的重复问题after 的设计理念响应示例 after 如何确保数据不重复核心机制Example步骤 1: 创建测试数据创建索引插入测试数据 步骤 2: 查询第一页结果查询第一页返…

两分钟掌握 TDengine 全部写入方式

1. 背景 TDengine 写入过程会涉及很多概念,这些概念目前你是不是还一团乱,参数绑定写入、无模式写入、websocket 写入、RESTFUL 写入 、各种连接器写入等等一堆的写入,都是做什么的,不明白,这里花两分钟时间给你彻底整…

快速理解24种设计模式

简单工厂模式 建立产品接口类,规定好要实现方法。 建立工厂类,根据传入的参数,实例化所需的类,实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例,并提供一个访问他它的全局…

数据可视化echarts学习笔记

目录,介绍 知识储备 一端操作,多端联动的效果(开启了多个网页,操作一端,多个网页的效果会跟着改变) cmd命令控制面板返回上一级或上上级 在当前目录打开文件: cd 文件名 在Windows命令提示符&am…

OpenCV相机标定与3D重建(30)过滤二值图像中的小斑点函数filterSpeckles()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在视差图中过滤掉小的噪声斑点(speckles)。 cv::filterSpeckles 是 OpenCV 库中的一个函数,用于过滤图像或视…

C语言期末复习笔记(中)

目录 五、选择控制结构 1.算法中的概念及描述方法 2.关系运算符和逻辑表达式 3.条件运算符和条件表达式 4.两种多分支if 5.switch语句 6.逻辑运算符和逻辑表达式 六、循环控制结构 1.控制循环的方式 2.控制非法输入 3.选择三种循环的一般原则 4.猜数游戏 5.嵌套循环…

利用Gurobi追溯模型不可行原因的四种方案及详细案例

文章目录 1. 引言2. 追溯不可行集的四种方法2.1 通过约束增减进行判断2.2 通过computeIIS函数获得冲突集2.3 利用 feasRelaxS() 或 feasRelax() 函数辅助排查2.4 利用 IIS Force 属性1. 引言 模型不可行是一个让工程师头疼的问题,对于复杂模型而言,导致模型不可行的原因可能…

MySQL和HBase的对比

Mysql :关系型数据库,主要面向 OLTP ,支持事务,支持二级索引,支持 sql ,支持主从、 Group Replication 架构模型(此处以 Innodb 为例,不涉及别的存储引擎)。 HBase &am…

mybatis-plus自动填充时间的配置类实现

mybatis-plus自动填充时间的配置类实现 在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis…

【软件工程】十万字知识点梳理 | 期末复习专用

原创文章,禁止转载。 文章目录 图CRC卡片用例图类图状态图活动图泳道图软件质量因素自顶向下集成自底向上集成人员与工作量之间的关系时序图关键路径软件结构基本路径测试判定表数据流图(DFD)体系结构设计问题数据字典挣值分析等价划分程序流程图PAD | N-S燃尽图甘特图对象模…

STM32完全学习——FLASH上FATFS文件管理系统

一、需要移植的接口 我们通过看官网的手册,可以看到我们只要完成下面函数的实现,就可以完成移植。我们这里只移植前5个函数,获取时间的函数我们不在这里移植。 二、移植接口函数 DSTATUS disk_status (BYTE pdrv /* Physical drive nmuber…

Redis - Token JWT 概念解析及双token实现分布式session存储实战

Token 定义:令牌,访问资源接口(API)时所需要的资源凭证 一、Access Token 定义:访问资源接口(API)时所需要的资源凭证,存储在客户端 组成 组成部分说明uid用户唯一的身份标识time…

软体机器人研究报告:设计方法、材料与驱动、感知与控制

软体机器人因其出色的可变形性和高适应性受到了广泛关注,这些特性使其在医疗、救援、探测等复杂场景中展现出独特的优势和巨大的应用潜力。研究人员对软体机器人的设计方法、材料与驱动技术、感知与控制策略等方面进行深入研究,取得了一系列成果。 本文汇…

imgproxy图像处理的高效与安全

摘要 imgproxy作为一个高效且安全的独立服务器,为图像处理提供了全新的解决方案。它不仅简化了图像调整和转换的过程,还极大地提升了处理速度,确保了整个流程的安全性。通过集成imgproxy,用户可以轻松优化网页上的图像,提高加载速度,改善用户体验。本文将深入探讨imgpro…

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量,你可以使用以下 SQL 查询语句: SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释: …

RTMW:实时多人2D和3D 全人体姿态估计

单位:上海AI实验室 代码:mmpose/tree/main/projects/rtmpose 系列文章目录 RTMO: 面向高性能单阶段的实时多人姿态估计 目录 系列文章目录摘要一、背景二、相关工作2.1 自上而下的方法。2.2 坐标分类。2.3 3D Pose 3 实验方法3.1.1 任务限制3.1.3训练技…

香橙派5Plus启动报错bug: spinlock bad magic on cpu#6, systemd-udevd/443

一、问题 如图: 接上调试串口,每次启动都会报错。不过使用过程中没有发现有什么影响。 百度查阅,有一位博主提到,但是没有细说解决方案: spinlock变量没有初始化_spinlock bad magic on-CSDN博客https://blog.csdn.n…