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:[email protected]

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

3. 词法分析器

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

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

2. 词法分析中会检查token是否为keyword。

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

1.1 词法分析器(Lexer)

词法分析器又称为 Scanner,Lexical analyser和Tokenizer。程序设计语言通常由keyword和严格定义的语法结构组成。编译的终于目的是将程序设计语言的高层指令翻译成物力机器或 虚拟机能够运行的指令。此法分析器的工作是分析量化那些本来毫无意义的字符流,将他们翻译成离散的字符组(也就是一个一个的Token)括keyword,标识 符,符号(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

时间: 2024-10-11 14:43:06

atitit.java解析sql语言解析器解释器的实现的相关文章

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

好程序员Java分享SQL语言之索引,前言:本章我们将学习MySQL中的索引,本文将从索引的作用.索引的分类.创建索引的语法.索引的使用策略以及索引的实现原理等方面带大家了解索引. 索引的作用 索引的作用就是加快查询速度,如果把使用了索引的查询看做是法拉利跑车的话,那么没有用索引的查询就相当于是自行车.目前实际项目中表的数据量越来越大,动辄上百万上千万级别,没有索引的查询会变得非常缓慢,使用索引成为了查询优化的必选项目. 索引的概念 索引其实是一种特殊的数据,也保存在数据库文件中,索引数据保存着

sql注入解析

sql注入解析 sql注入解析(一)基本语法 sql注入解析(二)执行注入 sql注入解析(三)数据库类型 sql注入解析(四)避开过滤

atitit. java jsoup html table的读取解析 总结

atitit. java jsoup html table的读取解析 总结 1. 两个大的parser ,,,jsoup 跟个   htmlparser 1 2. 资料比较 1 3. jsoup越佳.. 1 4. 解析并提取 HTML 元素的模式( 选择器 and  DOM 方式 ) 2 5. html修改 2 6. 跟个htmlparse的比较 2 7. jsoup的用处 3 7.1. html解析 3 7.2. html修改 3 7.3. HTML 文档清理 3 8. code--读取解析表

Mysql研究之SQL语言的设计与编写完全解析

 一.SQL语句分类 数据定义语言(DDL): 用于定义和管理数据对象,包括数据库.数据表.视图.索引等.例如:CREATE.DROP.ALTER等语句. 数据操作语言(DML):[和表中的数据记录有关的语言] 用于操作数据库对象中所包含的数据.例如:INSERT.UPDATE.DELETE语句. 数据查询语言(DQL): 用于查询数据库对象中所包含的数据,能够进行单表查询.连接查询.嵌套查询,以及集合查询等各种复杂程度不同的数据库查询,并将数据返回到客户机中显示.例如:SELECT语句(占

利用 druid 解析器解析SQL

最近参与一个开源项目,一个功能的实现,用到了 druid 解析器来解析SQL,记录下如果使用 druid 来解析SQL,实现对SQL的拦截改写. 1. 对 insert 语句进行解析: private static String convertInsertSQL(String sql){ try{ MySqlStatementParser parser = new MySqlStatementParser(sql); SQLStatement statement = parser.parseSt

MySQL技术探索01实现SQL语法解析器

本文将介绍如何使用开源的语法和词法分析框架bison和flex来实现SQL解析器.出于技术学习的目的,本文做描述的微型SQL解析器仅能实现对微型SQL的语法解析. 1.MySQL中的SQL解析器 包括JDBC.ODBC.ADO等等关系数据库客户端应用开发框架在内的各种SDK,核心功能是帮助程序员简化各种客户端的数据库操作,同时将SQL语句通过网络形式发送给MySQL等关系数据库的服务器进程.MySQL服务器进行负责解析并执行这些SQL语句.SQL语句中的语法规则多种多样,MySQL服务器是如何实

Java学习总结(21)——XML文档解析:DOM解析,SAX解析

一.XML简介1.可扩展性标记语言(eXtensible Markup Language)2.XML用于描述数据3.应用场合:(1)持久化存储数据(2)数据交换(3)数据配置4.XML语法(1)文档类型:在编写XML文档时,需要先使用文档声明,声明XML文档的类型.最简单的声明语法:<?Xml version="1.0" ?>用encoding属性说明文档的字符编码:<?Xml version="1.0" encoding="GB2312

Oracle SQL的硬解析和软解析

我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析.在Oracle中存在两种类型的SQL语句,一类为 DDL语句(数据定义语言),他们是从来不会共享使用的,也就是每次执行都需要进行硬解析.还有一类就是DML语句(数据操纵语言),他们会根据情况选择要么进行硬解析,要么进行软解析. DML:INSERT,UPDATE,DELETE,SELECT DDL:CREATE,DROP,ALTER 一.  SQL 解析过程 Oracle对此SQL将进行几个步骤的处理过

Java 内存泄漏--全解析和处理办法 [ 转载 ]

Java内存泄露——全解析和处理办法 [转载] @author 小筐子 @address http://www.jianshu.com/p/bf159a9c391a 本文章会一步一步的探讨内存泄露的问题.博主第一次书写长篇技术贴,如有错误或不周到的地方请多指教. JAVA是垃圾回收语言的一种,开发者无需特意管理内存分配.但是JAVA中还是存在着许多内存泄露的可能性,如果不好好处理内存泄露,会导致APP内存单元无法释放被浪费掉,最终导致内存全部占据堆栈(heap)挤爆进而程序崩溃. 内存泄露 说到