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
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

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









HQL と SQL は Hibernate フレームワークで比較されます。HQL (1. オブジェクト指向構文、2. データベースに依存しないクエリ、3. タイプ セーフティ)、SQL はデータベースを直接操作します (1. データベースに依存しない標準、2. 複雑な実行可能ファイル)。クエリとデータ操作)。

Huawei 携帯電話にデュアル WeChat ログインを実装するにはどうすればよいですか?ソーシャルメディアの台頭により、WeChatは人々の日常生活に欠かせないコミュニケーションツールの1つになりました。ただし、多くの人は、同じ携帯電話で同時に複数の WeChat アカウントにログインするという問題に遭遇する可能性があります。 Huawei 社の携帯電話ユーザーにとって、WeChat の二重ログインを実現することは難しくありませんが、この記事では Huawei 社の携帯電話で WeChat の二重ログインを実現する方法を紹介します。まず第一に、ファーウェイの携帯電話に付属するEMUIシステムは、デュアルアプリケーションを開くという非常に便利な機能を提供します。アプリケーションのデュアルオープン機能により、ユーザーは同時に

プログラミング言語 PHP は、さまざまなプログラミング ロジックやアルゴリズムをサポートできる、Web 開発用の強力なツールです。その中でも、フィボナッチ数列の実装は、一般的で古典的なプログラミングの問題です。この記事では、PHP プログラミング言語を使用してフィボナッチ数列を実装する方法を、具体的なコード例を添付して紹介します。フィボナッチ数列は、次のように定義される数学的数列です。数列の最初と 2 番目の要素は 1 で、3 番目の要素以降、各要素の値は前の 2 つの要素の合計に等しくなります。シーケンスの最初のいくつかの要素

Huawei 携帯電話に WeChat クローン機能を実装する方法 ソーシャル ソフトウェアの人気と人々のプライバシーとセキュリティの重視に伴い、WeChat クローン機能は徐々に人々の注目を集めるようになりました。 WeChat クローン機能を使用すると、ユーザーは同じ携帯電話で複数の WeChat アカウントに同時にログインできるため、管理と使用が容易になります。 Huawei携帯電話にWeChatクローン機能を実装するのは難しくなく、次の手順に従うだけです。ステップ 1: 携帯電話システムのバージョンと WeChat のバージョンが要件を満たしていることを確認する まず、Huawei 携帯電話システムのバージョンと WeChat アプリが最新バージョンに更新されていることを確認します。

【PHPにおけるミッドポイントの意味と使い方の分析】 PHPでは、ミッドポイント(.)は2つの文字列やオブジェクトのプロパティやメソッドを接続するためによく使われる演算子です。この記事では、PHP における中間点の意味と使用法を詳しく掘り下げ、具体的なコード例を示して説明します。 1. 文字列中間点演算子の接続 PHP での最も一般的な使用法は、2 つの文字列を接続することです。 2 つの文字列の間に . を置くと、それらをつなぎ合わせて新しい文字列を形成できます。 $string1=&qu

今日のソフトウェア開発分野では、効率的で簡潔かつ同時実行性の高いプログラミング言語として、Golang (Go 言語) が開発者にますます好まれています。豊富な標準ライブラリと効率的な同時実行機能により、ゲーム開発の分野で注目を集めています。この記事では、ゲーム開発に Golang を使用する方法を検討し、具体的なコード例を通じてその強力な可能性を示します。 1. ゲーム開発における Golang の利点 Golang は静的型付け言語として、大規模なゲーム システムの構築に使用されます。

大規模モデルの継続的な最適化に基づいて、LLM エージェント - これらの強力なアルゴリズム エンティティは、複雑な複数ステップの推論タスクを解決する可能性を示しています。自然言語処理から深層学習に至るまで、LLM エージェントは徐々に研究や業界の焦点になりつつあります。LLM エージェントは、人間の言語を理解して生成するだけでなく、戦略を策定し、多様な環境でタスクを実行し、API 呼び出しやコーディングを使用して構築することもできます。ソリューション。この文脈において、AgentQuest フレームワークの導入はマイルストーンであり、LLM エージェントの評価と進歩のためのモジュール式ベンチマーク プラットフォームを提供するだけでなく、研究者にこれらのエージェントのパフォーマンスを追跡および改善するための強力なツールも提供します。より細かいレベル

Win11 の新機能の分析: Microsoft アカウントへのログインをスキップする方法 Windows 11 のリリースにより、多くのユーザーは、Windows 11 がより便利で新しい機能をもたらしたことに気づきました。ただし、ユーザーによっては、自分のシステムが Microsoft アカウントに関連付けられることを好まず、この手順をスキップしたい場合があります。この記事では、ユーザーが Windows 11 で Microsoft アカウントへのログインをスキップし、よりプライベートで自律的なエクスペリエンスを実現するのに役立ついくつかの方法を紹介します。まず、一部のユーザーが Microsoft アカウントにログインすることに抵抗がある理由を理解しましょう。一方で、一部のユーザーは次のことを心配しています。
