atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sql的AST 1 3. 词法分析器 2 4. 语法分析器--ANTLR 2 5. Eclipse插件,,ANTLR Studio 3 6.

atitit.java解析sql语言解析器解释器的实现

1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1

2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sql的AST 1

3. 词法分析器 2

4. 语法分析器--ANTLR 2

5. Eclipse插件,,ANTLR Studio 3

6. 一个基于javacc实现的解析器JSqlParser0.7(yr2011), 3

7. 例子代码-----解析sql表格列的名称and类型 3

8. }Sql的历史 4

9. 解析select语句 4

10. zql,JSqlParser,General sql parser. 5

11. ANTLR实现的SQL解析器 - OQL 5

12. Javacc/AST简单的介绍 5

13. SQLJEP http://sqljep.sourceforge.net/ 5

14. Sql生成SqlBuilder ,Querydsl ,hb 6

15. 俄的总结: 还凑火JSqlParser0.7走行兰. 6

16. 参考 6

1. 解析sql的本质:实现一个4gl dsl编程语言的编译器

Sql走十一个4gl dsl,..SQL解析器基本上走十一个编译器实现

2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sql的AST

首先要进行词法分析,而后进行语法分析,语义分析

词法分析,and 语法分析>>>.

词法分析即将输入的语句进行分词(token),解析出每个token的意义。分词的本质便是正则表达式的匹配过程,比较流行的分词工具应该是lex,通 过简单的规则制定,来实现分词。Lex一般和yacc结合使用。关于lex和yacc的基础知识请参考Yacc 与Lex 快速入门- IBM。如果想深入学习的话,可以看下《LEX与YACC》。

然而Mysql并没有使用lex来实现词法分析,但是语法分析却用了yacc,而yacc需要词法分析函数yylex,

不过ANTLR更多简化...

作者:: 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

3. 词法分析器

MySQL的词法分析器是手工打造的。

语法分析器的入口函数是MYSQLparse,词法分析器的入口函数是MYSQLlex。

2. 词法分析中会检查token是否为关键字。

最直接的做法是弄个大的关键字数组,进行折半查找

1.1 词法分析器(Lexer)

词法分析器又称为 Scanner,Lexical analyser和Tokenizer。程序设计语言通常由关键字和严格定义的语法结构组成。编译的最终目的是将程序设计语言的高层指令翻译成物力机器或 虚拟机可以执行的指令。此法分析器的工作是分析量化那些本来毫无意义的字符流,将他们翻译成离散的字符组(也就是一个一个的Token)括关键字,标识 符,符号(symbols)和操作符供语法分析器使用。

,Lexer不关心所生成的单个Token的语法意义及其与上下文之间的关系

ANTLR将上述两者结合起来,它允许我们定义识别字符流的词法规则和用于解释Token流的词法分析规则。然后,ANTLR将根据用户提供的语法文件自 动生成相应的词法/语法分析器。

4. 语法分析器--ANTLR

也因为不想和以下推自动机为原理的YACC/LEX生成的一大堆整数表打交道,我选择了另一个开源的LL(K)语法/词法分析器—ANTLR。

之前YACC/LEX显得过于学院派,而以LL(k)为基础的ANTLR虽然在效率上还略有不足

Lexer不关心所生成的单个Token的语法意义及其与上下文之间的关系,而这就是Parser的工作。语法分析器将收到的Tokens组织起来,并转换成为目标语言语法定义所允许的序列。

无论是Lexer还是Parser都是一种识别器,Lexer是字符序列识别器而Parser是Token序列识别器。他们在本质上是类似的东西,而只是在分工上有所不同而已。

ANTLR将上述两者结合起来,它允许我们定义识别字符流的词法规则和用于解释Token流的词法分析规则。然后,ANTLR将根据用户提供的语法文件自 动生成相应的词法/语法分析器。用户可以利用他们将输入的文本进行编译,并转换成其他形式(如AST—Abstract Syntax Tree,抽象的语法树)。构建sql的AST

5. Eclipse插件,,ANTLR Studio

为了更好的使用ANTLR,你还可以下载ANTLR的Eclipse插件来帮助你完成工作。ANTLR Studio

6. 一个基于javacc实现的解析器JSqlParser0.7(yr2011),

它可以把SQL语句转换为Java对象,由于JsqlParser是使用JavaCC做语法分析的,而本身JavaCC就支持JJTree...如是就写了个小工具SQLParser,将生成的对象以树的形式呈现出来^

JSqlParser存在的问题及解决

JSqlParser是一个SQL语句的解析器,包括常用的一些SQL语句,insert,update,select,delete等,但兼容的语法有限,比如括号,或者一些复杂的结构等。 对于转义字符的处理

7. 例子代码-----解析sql表格列的名称and类型

final String sql = filex.read("c:\\pojo.sql", "gbk");

new SqlParseO7(sql)

this.sqlParseO7.parse(new Closure()

public void parse(Closure c) throws JSQLParserException {

CCJSqlParserManager parserManager = new CCJSqlParserManager();

// String statement =

// "CREATE TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, "

// + "PRIMARY KEY (mycol2, mycol)) type = myisam";

CreateTable createTable = (CreateTable) parserManager

.parse(new StringReader(this.sql));

List columnDefinitions = createTable.getColumnDefinitions();

String tabName = createTable.getTable().getName();

// System.out.println(columnDefinitions.size());// 获得字段总数.

for (Object object : columnDefinitions) {

ColumnDefinition col = (ColumnDefinition) object;

Object[] oa = { col.getColumnName(),

col.getColDataType().getDataType(), tabName };

c.execute(oa);

}

8. }Sql的历史

9. 解析select语句

Statement stat = new CCJSqlParserManager().parse(new StringReader(

"select * from a where 姓名='崔永远'"));

Select select = (Select) stat;

Expression where = ((PlainSelect) select.getSelectBody()).getWhere();

WhereExpressionVisitor visitor = new WhereExpressionVisitor(rowMeta, where);

for (int i = 0; i < data.length; i++) {

Object result = visitor.eval(data[i]);

if (result instanceof Boolean && ((Boolean) result).booleanValue()) {

System.out.print("通过=====>");

} else {

System.out.print("不通过=====>");

}

System.out.println(StringUtils.join(data[i], ","));

}

10. zql,JSqlParser,General sql parser.

11. ANTLR实现的SQL解析器 - OQL

12. Javacc/AST简单的介绍

JavaCC 是一个代码生成器,可以根据输入的语言定义输出一个词法分析器和解析器,JavaCC 输出的代码是合法的可编译Java代码.解析器和词法分析器本身就是一个冗长而复杂的组件,手工编写一个这样的程序需要仔细考虑各条件的相互作用,总的来说,通过javacc完成一些字符串的分析,还是比较方便,现在普遍使用AST了。

13. SQLJEP http://sqljep.sourceforge.net/

SQLJEP 是一个用来解析和仿真执行SQL语句的Java类库。支持几乎所有 Oracle 和 MaxDB 的函数。SQLJEP 使用 JavaCC 来做词法分析。

14. Sql生成SqlBuilder ,Querydsl ,hb

3.SqlBuilder http://openhms.sourceforge.net/sqlbuilder/

SqlBuilder 是一个Java的类库,它试图帮你避免在Java程序内直接书写SQL查询的痛苦。你只需要使用 SqlBuilder 的方法,它就可以帮你生成对应的 SQL 数据库查询语句,例如下面一个SQL语句:

15. 俄的总结: 还凑火JSqlParser0.7走行兰.

16. 参考

Java 实现对Sql语句解析 - 翠竹林 - 博客园.htm

SQL 语法解释器jsqlparser - serv - ITeye技术网站.htm

Hibernate源代码分析 - 青火的笔记 - 记笔记 - 私塾在线 - 只做精品视频课程服务.htm

开源语法分析器--ANTLR - 薛笛的专栏 - 博客频道 - CSDN.NET.htm

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

mysql解释器_atitit.java解析sql语言解析器解释器的实现相关推荐

  1. 好程序员Java分享SQL语言之索引

    好程序员Java分享SQL语言之索引,前言:本章我们将学习MySQL中的索引,本文将从索引的作用.索引的分类.创建索引的语法.索引的使用策略以及索引的实现原理等方面带大家了解索引. 索引的作用 索引的 ...

  2. MySQL,Oracle系统学习,以及SQL语言-----数据库篇学习笔记

    Handouts MySQL和Oracle系统学习 一. 开篇立意(~~~~必看,有说明~~~~) 二. Oracle 篇 数据库存在之意义 基础概念(必须看,后面不会说明!!!) Oracle管理系 ...

  3. JavaWeb - 数据库,MySQL安装卸载,MySQL服务器存储结构,sql语言,使用sql操作数据库/数据库表/表中记录,聚集函数,分组操作,limit关键字,重置root密码

    转载请注明出处:https://blog.csdn.net/mythmayor/article/details/72781451 1.数据库的简介 (1)什么是数据库,就是一个文件系统,使用标准sql ...

  4. python自动解析json_Python语言解析JSON详解

    本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...

  5. mysql查询表变量_MySQL 之SQL语言、表库操作、查询及变量精讲

    SQL语言 1. SQL语言组成部分 DDL:定义语言 (create.drop.alter) DML:操作语言 (insert.delete.update.select) DCL: 控制语言 (gr ...

  6. MySQL查询语种关键字_SQL——SQL语言全部关键字详解

    http://blog.csdn.net/quinnnorris/article/details/71056445 数据库中我们做常用的就是SQL基本查询语言,甚至有些人认为数据库就是SQL,SQL就 ...

  7. c语言编程题报文解析,C语言解析pcap文件得到HTTP信息实例

    程序功能为解析由Wireshark生成的pcap文件. 实现步骤: 1)用Wireshark软件抓包得到test.pcap文件 2)程序:分析pcap文件头 -> 分析pcap_pkt头 -&g ...

  8. 〖Python 数据库开发实战 - MySQL篇⑨〗- 什么是 SQL 语言、如何创建数据逻辑库及如何创建数据表

    万叶集

  9. Java解析SQL生成语法树_Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python...

    Atitit.sql ast 表达式 语法树 语法 解析原理与实现java php c#.net js python 1.1.Sql语法树ast如下图锁死 2.SQL语句解析的思路和过程 2.1.le ...

最新文章

  1. SAP MM 某项目上产品层次的设计
  2. 关于文件导出(下载)功能不兼容IE浏览器的解决方案
  3. 一网打尽深度学习之卷积神经网络的经典网络(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)
  4. shell脚本安装mysql并安装一个小服务
  5. Android防盗系统推荐
  6. 【UVA - 11383】Claw Golden Tiger (二分图最优匹配,KM算法原理)
  7. Linux 服务器中文乱码编码解决
  8. Spring MVC 文件上传 文件下载
  9. 昇腾AI处理器软件栈--神经网络软件架构
  10. .NET MVC5+ Dapper+扩展+AutoFac自动注入实现
  11. 【OCR技术】大批量生成文字训练集
  12. PyTorch学习基础知识二
  13. 隐藏在计算机软硬件,隐匿在计算机软硬件背后的语言
  14. MySQL学习---作业(1)
  15. 关于苹果MFI认证那些事
  16. 浏览器与Node.js中的JavaScript运行环境
  17. / ./ ../路径含义
  18. 10-253 B2-1查找订单数最多的员工信息
  19. 双路由实现宽带和IPTV单播并存
  20. i国网app苹果版_阿里云盘app苹果版 -阿里云盘app官方手机版下载

热门文章

  1. C++之类型萃取技巧
  2. MarkDown页面添加锚点,跳转到本页指定位置
  3. 2018 中国服务创新大会 | 早鸟票正式开售
  4. 威胁情报大会直击 | 企业IT部王森:腾讯企业终端安全管理最佳实践
  5. springboot的核心
  6. leetcode 239. Sliding Window Maximum | 239. 滑动窗口最大值(单调栈,窗口内最大最小值更新结构)
  7. 微服务、容器、DevOps三者之间的演进关系,你清楚吗?
  8. 坦克大战 - 设计模式、BIO、NIO、AIO、Netty
  9. 【CentOS7配置】如何设置:启动后自动获取网络连接、配置固定IP
  10. vb 实现小超市饮料补货提醒程序 public全局变量的声明与初始化