zoukankan      html  css  js  c++  java
  • atitit.java解析sql语言解析器解释器的实现

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



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

    2. 解析sql的基本的流程,词法分析,而后进行语法分析,语义分析,构建sqlAST 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. zqlJSqlParserGeneral 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的基本的流程,词法分析,而后进行语法分析,语义分析,构建sqlAST

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

    词法分析,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是否为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. zqlJSqlParserGeneral 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

  • 相关阅读:
    Python yield 使用浅析
    python调试
    程序员常用的技术网站
    使用Pylint规范你的Python代码
    Python面试题整理-更新中
    2019-2020-1 1823《程序设计与数据结构》每周成绩
    2019-2020-1 1823《程序设计与数据结构》问题汇总(正在更新)
    2019-2020-1 1823《程序设计与数据结构》第二、三周作业总结
    2019-2020-1 1823《程序设计与数据结构》第一周作业总结
    2019-2020-1 1823《程序设计与数据结构》预备作业总结
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4083381.html
Copyright © 2011-2022 走看看