mysql解释器_atitit.java解析sql语言解析器解释器的实现
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中文網,轉載請注明出處,感謝您的尊重!
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的mysql解释器_atitit.java解析sql语言解析器解释器的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 只返回第一条_mybatis
- 下一篇: linux mysql dns_Linu