標籤: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語言解析器解譯器的實現