atitit.java解析sql語言解析器解譯器的實現

來源:互聯網
上載者:User

標籤:style   blog   http   io   color   ar   os   使用   java   

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解析器 - OQL12. 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

 

atitit.java解析sql語言解析器解譯器的實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.