Java SQL Parserを調査する
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[JAVAの記事一覧]]
[[構文解析の記事一覧]]
&topicpath;
*目次 [#pccd97cd]
#contents
*Java SQL Parserを調査する [#zb549a4a]
*動機 [#d8f88e2b]
SQLを解析することで、SQLを動的に解析して単体試験仕様書の...
そのためには次の項目を自動抽出したい。
*自動抽出目標項目 [#y3bf4f8c]
この記事を書くにあたっての目標である。
-変数
Oracleのプレースホルダー
-テーブル
-検索条件
-結果項目
さらにいうと、
-検索条件が外部結合なのかどうなのか
-結果項目が外部結合の項目なのかどうなのか
*その他達成しようとしていること [#k8df5a88]
SQLを解析し、Excelで定義してある和名を検索し和名表示に置...
そのためには、SQL解析にて、次の対応表を作成する。
**テーブルの別名とテーブル名 [#jda39e70]
**テーブル名とテーブル和名 [#d8333138]
**WHERE句などの解析方法について考える [#pd22017c]
WHERE句を解析するには正規表現などを駆使して文法を解析する...
*全体的な感想 [#v89144f2]
簡単な文法レベルでいいから手軽にパーサを生成して活用でき...
*Java SQL Parser [#tc368e00]
**ANTLR [#d305b35b]
http://www.antlr.org/grammar/list
まずは上記のFAQから読み始めたほうがいいが、英語なので、英...
***使い方の参考URL [#x934b7b7]
http://www.limy.org/program/java/antlr/step1.html
***ANTLRの文法ファイル(.g)をNetBeans Scriptingファイル(.n...
http://snakemanshow.blogspot.com/2008/02/antlr.html
***特徴 [#zd36fbf9]
-ANSI SQL 文法に則っているらしい
-本格的なツールだが、学習コストが高い。
-過去のコードは微調整が必要なので、修正できるだけの文法知...
-英語の本が出版されている模様
-グラフィカルなIDEはJREがインストールされていればダブルク...
-外部にの文法を定義するファイルが必要で拡張子は.gがつかわ...
-手軽にできる方法があるのかもしれないが、作りがオールマイ...
***使い方 [#y4a50bfe]
よくわからない状態で、ためしにEclipseのビルドパスに外部Ja...
http://www.antlr.org/wiki/display/ANTLR3/ANTLR+Cheat+Sheet
をためしてみたが、TLexerとTParserが見つからない、どうやら...
***expr.g [#b5fa1b0a]
expr.gで下記の内容を保存してみる。
class ExprParser extends Parser;
expr:
mexpr ((PLUS|MINUS) mexpr)*
;
mexpr:
atom (STAR atom)*
;
atom:
INT | LPAREN expr RPAREN
;
class ExprLexer extends Lexer;
options {
k=2; // needed for newline junk
charVocabulary='\u0000'..'\u007F'; // allow ascii
}
LPAREN: '(' ;
RPAREN: ')' ;
PLUS : '+' ;
MINUS : '-' ;
STAR : '*' ;
INT : ('0'..'9')+ ;
WS : ( ' '
| '\r' '\n'
| '\n'
| '\t'
)
{$setType(Token.SKIP);}
;
次のようにコマンドラインで実行する
java -classpath antlr-3.2.jar antlr.Tool expr.g
なにやらファイルが生成された
***PLSQLの定義ファイルはこちら [#e34a0fb0]
http://www.antlr.org/grammar/1174072667394/PLSQLGrammar.g
上記ファイルをダウンロードして下記のように打ち込むと
java -classpath antlr-3.2.jar antlr.Tool PLSQLGrammar.g
クラスファイルが出来上がる。
で、下記のクラスを要求している
-SoftwareMetrics
そのファイルは下記よりダウンロード可である。
***SoftwareMetricsクラスはこちら [#vc0354bc]
http://www.antlr.org/grammar/1174072667394/SoftwareMetric...
でこのSoftwareMetricsはいろいろ摩訶不思議な設定が必要だが...
***PLSQLMain [#m1041498]
http://www.antlr.org/grammar/1174072667394/PLSQLMain.java
***eclipse plugin [#i37aa57a]
http://antlreclipse.sourceforge.net/
*** Using ANTLRWorks with Java.g [#wa6d7ae4]
http://openjdk.java.net/projects/compiler-grammar/antlrwo...
***感想 [#u57d8490]
-IDEがすばらしい
-JavaSDKの開発者も使ってるんじゃないのか
http://openjdk.java.net/projects/compiler-grammar/antlrwo...
-グラフィック表示がすばらしい
-いろいろな言語へのAPIが提供されている。
-コンパイルすんの?これ。
**Apache Derby. [#dd48fb97]
Apache Derby
http://db.apache.org/derby/
はApacheのDBのサブプロジェクトでしてそのApache Derbyにパ...
.native() メソッドを見るといいようだ。
**Zql [#cb147f36]
http://www.gibello.com/code/zql/
Javaで書かれたSQLのParser
OracleのDECODEとかの関数がデフォルトで定義されていない
p = new ZqlParser();
p.addCustomFunction("DECODE", 0);
とするが、引数の数値のエラーがでたまま解析が実行できない。
下記のアドレスが参考になりそうだが、MDLがよくわからんので...
http://blogs.oracle.com/warehousebuilder/2007/08/14/
***Demoの動かし方 [#n19f9fef]
cmd
でDOSプロンプト起動
cd xxxデモのあるディレクトリ
でデモファイルがあるディレクトリをカレントディレクトリに...
READMEには
java ZDemo queries.num
とあるが、パスを通しておく
java -cp .;..\classes ZDemo queries.num
***Demo実行結果 [#a0b1ada9]
select * from num
[a = 1.0, b = 1.0, c = 1.0, d = 1.0, e = 1.0]
[a = 2.0, b = 2.0, c = 2.0, d = 2.0, e = 2.0]
[a = 1.0, b = 2.0, c = 3.0, d = 4.0, e = 5.0]
[a = 5.0, b = 4.0, c = 3.0, d = 2.0, e = 1.0]
select * from num where ((1 + 1) = 2)
[a = 1.0, b = 1.0, c = 1.0, d = 1.0, e = 1.0]
[a = 2.0, b = 2.0, c = 2.0, d = 2.0, e = 2.0]
[a = 1.0, b = 2.0, c = 3.0, d = 4.0, e = 5.0]
[a = 5.0, b = 4.0, c = 3.0, d = 2.0, e = 1.0]
select ((((a + b) + c) + d) + e) from num
5.0
10.0
15.0
15.0
略
***ちなみにもうひとつのデモを試す [#udc6effd]
java -cp .;..\classes StringDemo "select * from num wher...
結果
select * from num where (foo = bar) order by fuga ASC
**BYACC/J [#hf6fdc85]
http://byaccj.sourceforge.net/
YACCと互換性あるそうな。
すでに、YACCでの.yのファイルがたくさんある場合。たしかに...
となると、参考になる構文解析の定義ファイル一覧を持ってい...
ただし、その場合、自分で微調整できるスキルがないとだめだ...
**Java Cup [#f82fb0f2]
http://www2.cs.tum.edu/projects/cup/
bisonのようなボトムアップ型の構文解析のJavaコードを生成し...
JavaのParser生成ライブラリー
***ボトムアップの構文解析アルゴリズム [#e7dd3241]
bisonのアルゴリズムの解説
http://www.bookshelf.jp/texi/bison/bison-ja_8.html
***補足 [#q45a13be]
ちなみにC言語の構文解析を生成するのはbisonと呼ばれる
トップダウン型のJava構文解析の生成にはJavaCCがある。
**JFlex [#s987734b]
JFlexはこちら
http://jflex.de/
ちなみにC言語の字句解析器生成言語はflexという。
**Pythonでの構文解析 [#r02099da]
Python言語でいうところのSparkモジュールに相当するかも
Pythonのその他の構文解析モジュールについては下記URLがまと...
http://nedbatchelder.com/text/python-parsers.html
**Javascript [#r98095fc]
パーサコンビネータを作っちゃう人の記事
http://inforno.net/articles/tag/javascript/
***特徴 [#f4851a4c]
-演算子を優先とする文法
-正確なエラー箇所
-再利用可能な豊富な再結合用関数
-BNFの宣言可能なAPI
*構文解析についての考察や疑問 [#b1eb11c3]
**構文解析と正規表現の関係についての考察 [#h2e2d5a5]
すべて正規表現でまかなうことは可能ではないということなのか
文字列は正規表現でマッチングできるが、さらにそれをトーク...
それとも、正規表現を線形的なパターンマッチだとあえて言う...
**構文解析とScalaについての考察 [#h95e760f]
構文解析の定義はScala言語のcase match に似ている
Scalaには構文解析ツールとして、パーサコンビネータが標準で...
***Scalaで電卓を作る [#f329a8c5]
多忙な Java 開発者のための Scala ガイド: 電卓を作る、第 1...
http://www.ibm.com/developerworks/jp/java/library/j-scala...
多忙な Java 開発者のための Scala ガイド: 電卓を作る、第 2...
http://www.ibm.com/developerworks/jp/java/library/j-scala...
多忙な Java 開発者のための Scala ガイド: 電卓を作る、第 3...
http://www.ibm.com/developerworks/jp/java/library/j-scala...
***その他参考URL [#b752ea1d]
構文解析
http://sites.google.com/site/scalamemo/raiburari/parsing
第18回 Scalaとパーザコンビネータ(実装編)
Hello worldのサンプルがのっていてわかりやすいかもです。
http://itpro.nikkeibp.co.jp/article/COLUMN/20100526/348454/
Scala のパーサコンビネータで罠にはまった
http://d.hatena.ne.jp/thinca/20100119/1263837522
**字句解析とクラスについての考察 [#r4ef15da]
そもそも、トークンとはクラスとして置き換えることができそ...
たとえば正規表現でデータをマッチさせて、クラスを生成すれ...
*パーサ開発ソフトウェア [#j91f93e1]
wikiに掲載されていた一覧をのせておきます。
-ANTLR
-Bison
-Coco/R
-GOLD
-JavaCC
-Lemon Parser
-Lex
-LRgen
-Rebol
-SableCC
-Spirit Parser Framework
-Yacc
**JavaCC [#t4b674c6]
***JavaCCによる配列リテラルの表現 [#hbcb40c3]
Expression[] arrayLiteral() :{...}{
"[" [expression() ("," expression())*] "]" { ... }
}
Expression expression() :{...}{...}
終了行:
[[JAVAの記事一覧]]
[[構文解析の記事一覧]]
&topicpath;
*目次 [#pccd97cd]
#contents
*Java SQL Parserを調査する [#zb549a4a]
*動機 [#d8f88e2b]
SQLを解析することで、SQLを動的に解析して単体試験仕様書の...
そのためには次の項目を自動抽出したい。
*自動抽出目標項目 [#y3bf4f8c]
この記事を書くにあたっての目標である。
-変数
Oracleのプレースホルダー
-テーブル
-検索条件
-結果項目
さらにいうと、
-検索条件が外部結合なのかどうなのか
-結果項目が外部結合の項目なのかどうなのか
*その他達成しようとしていること [#k8df5a88]
SQLを解析し、Excelで定義してある和名を検索し和名表示に置...
そのためには、SQL解析にて、次の対応表を作成する。
**テーブルの別名とテーブル名 [#jda39e70]
**テーブル名とテーブル和名 [#d8333138]
**WHERE句などの解析方法について考える [#pd22017c]
WHERE句を解析するには正規表現などを駆使して文法を解析する...
*全体的な感想 [#v89144f2]
簡単な文法レベルでいいから手軽にパーサを生成して活用でき...
*Java SQL Parser [#tc368e00]
**ANTLR [#d305b35b]
http://www.antlr.org/grammar/list
まずは上記のFAQから読み始めたほうがいいが、英語なので、英...
***使い方の参考URL [#x934b7b7]
http://www.limy.org/program/java/antlr/step1.html
***ANTLRの文法ファイル(.g)をNetBeans Scriptingファイル(.n...
http://snakemanshow.blogspot.com/2008/02/antlr.html
***特徴 [#zd36fbf9]
-ANSI SQL 文法に則っているらしい
-本格的なツールだが、学習コストが高い。
-過去のコードは微調整が必要なので、修正できるだけの文法知...
-英語の本が出版されている模様
-グラフィカルなIDEはJREがインストールされていればダブルク...
-外部にの文法を定義するファイルが必要で拡張子は.gがつかわ...
-手軽にできる方法があるのかもしれないが、作りがオールマイ...
***使い方 [#y4a50bfe]
よくわからない状態で、ためしにEclipseのビルドパスに外部Ja...
http://www.antlr.org/wiki/display/ANTLR3/ANTLR+Cheat+Sheet
をためしてみたが、TLexerとTParserが見つからない、どうやら...
***expr.g [#b5fa1b0a]
expr.gで下記の内容を保存してみる。
class ExprParser extends Parser;
expr:
mexpr ((PLUS|MINUS) mexpr)*
;
mexpr:
atom (STAR atom)*
;
atom:
INT | LPAREN expr RPAREN
;
class ExprLexer extends Lexer;
options {
k=2; // needed for newline junk
charVocabulary='\u0000'..'\u007F'; // allow ascii
}
LPAREN: '(' ;
RPAREN: ')' ;
PLUS : '+' ;
MINUS : '-' ;
STAR : '*' ;
INT : ('0'..'9')+ ;
WS : ( ' '
| '\r' '\n'
| '\n'
| '\t'
)
{$setType(Token.SKIP);}
;
次のようにコマンドラインで実行する
java -classpath antlr-3.2.jar antlr.Tool expr.g
なにやらファイルが生成された
***PLSQLの定義ファイルはこちら [#e34a0fb0]
http://www.antlr.org/grammar/1174072667394/PLSQLGrammar.g
上記ファイルをダウンロードして下記のように打ち込むと
java -classpath antlr-3.2.jar antlr.Tool PLSQLGrammar.g
クラスファイルが出来上がる。
で、下記のクラスを要求している
-SoftwareMetrics
そのファイルは下記よりダウンロード可である。
***SoftwareMetricsクラスはこちら [#vc0354bc]
http://www.antlr.org/grammar/1174072667394/SoftwareMetric...
でこのSoftwareMetricsはいろいろ摩訶不思議な設定が必要だが...
***PLSQLMain [#m1041498]
http://www.antlr.org/grammar/1174072667394/PLSQLMain.java
***eclipse plugin [#i37aa57a]
http://antlreclipse.sourceforge.net/
*** Using ANTLRWorks with Java.g [#wa6d7ae4]
http://openjdk.java.net/projects/compiler-grammar/antlrwo...
***感想 [#u57d8490]
-IDEがすばらしい
-JavaSDKの開発者も使ってるんじゃないのか
http://openjdk.java.net/projects/compiler-grammar/antlrwo...
-グラフィック表示がすばらしい
-いろいろな言語へのAPIが提供されている。
-コンパイルすんの?これ。
**Apache Derby. [#dd48fb97]
Apache Derby
http://db.apache.org/derby/
はApacheのDBのサブプロジェクトでしてそのApache Derbyにパ...
.native() メソッドを見るといいようだ。
**Zql [#cb147f36]
http://www.gibello.com/code/zql/
Javaで書かれたSQLのParser
OracleのDECODEとかの関数がデフォルトで定義されていない
p = new ZqlParser();
p.addCustomFunction("DECODE", 0);
とするが、引数の数値のエラーがでたまま解析が実行できない。
下記のアドレスが参考になりそうだが、MDLがよくわからんので...
http://blogs.oracle.com/warehousebuilder/2007/08/14/
***Demoの動かし方 [#n19f9fef]
cmd
でDOSプロンプト起動
cd xxxデモのあるディレクトリ
でデモファイルがあるディレクトリをカレントディレクトリに...
READMEには
java ZDemo queries.num
とあるが、パスを通しておく
java -cp .;..\classes ZDemo queries.num
***Demo実行結果 [#a0b1ada9]
select * from num
[a = 1.0, b = 1.0, c = 1.0, d = 1.0, e = 1.0]
[a = 2.0, b = 2.0, c = 2.0, d = 2.0, e = 2.0]
[a = 1.0, b = 2.0, c = 3.0, d = 4.0, e = 5.0]
[a = 5.0, b = 4.0, c = 3.0, d = 2.0, e = 1.0]
select * from num where ((1 + 1) = 2)
[a = 1.0, b = 1.0, c = 1.0, d = 1.0, e = 1.0]
[a = 2.0, b = 2.0, c = 2.0, d = 2.0, e = 2.0]
[a = 1.0, b = 2.0, c = 3.0, d = 4.0, e = 5.0]
[a = 5.0, b = 4.0, c = 3.0, d = 2.0, e = 1.0]
select ((((a + b) + c) + d) + e) from num
5.0
10.0
15.0
15.0
略
***ちなみにもうひとつのデモを試す [#udc6effd]
java -cp .;..\classes StringDemo "select * from num wher...
結果
select * from num where (foo = bar) order by fuga ASC
**BYACC/J [#hf6fdc85]
http://byaccj.sourceforge.net/
YACCと互換性あるそうな。
すでに、YACCでの.yのファイルがたくさんある場合。たしかに...
となると、参考になる構文解析の定義ファイル一覧を持ってい...
ただし、その場合、自分で微調整できるスキルがないとだめだ...
**Java Cup [#f82fb0f2]
http://www2.cs.tum.edu/projects/cup/
bisonのようなボトムアップ型の構文解析のJavaコードを生成し...
JavaのParser生成ライブラリー
***ボトムアップの構文解析アルゴリズム [#e7dd3241]
bisonのアルゴリズムの解説
http://www.bookshelf.jp/texi/bison/bison-ja_8.html
***補足 [#q45a13be]
ちなみにC言語の構文解析を生成するのはbisonと呼ばれる
トップダウン型のJava構文解析の生成にはJavaCCがある。
**JFlex [#s987734b]
JFlexはこちら
http://jflex.de/
ちなみにC言語の字句解析器生成言語はflexという。
**Pythonでの構文解析 [#r02099da]
Python言語でいうところのSparkモジュールに相当するかも
Pythonのその他の構文解析モジュールについては下記URLがまと...
http://nedbatchelder.com/text/python-parsers.html
**Javascript [#r98095fc]
パーサコンビネータを作っちゃう人の記事
http://inforno.net/articles/tag/javascript/
***特徴 [#f4851a4c]
-演算子を優先とする文法
-正確なエラー箇所
-再利用可能な豊富な再結合用関数
-BNFの宣言可能なAPI
*構文解析についての考察や疑問 [#b1eb11c3]
**構文解析と正規表現の関係についての考察 [#h2e2d5a5]
すべて正規表現でまかなうことは可能ではないということなのか
文字列は正規表現でマッチングできるが、さらにそれをトーク...
それとも、正規表現を線形的なパターンマッチだとあえて言う...
**構文解析とScalaについての考察 [#h95e760f]
構文解析の定義はScala言語のcase match に似ている
Scalaには構文解析ツールとして、パーサコンビネータが標準で...
***Scalaで電卓を作る [#f329a8c5]
多忙な Java 開発者のための Scala ガイド: 電卓を作る、第 1...
http://www.ibm.com/developerworks/jp/java/library/j-scala...
多忙な Java 開発者のための Scala ガイド: 電卓を作る、第 2...
http://www.ibm.com/developerworks/jp/java/library/j-scala...
多忙な Java 開発者のための Scala ガイド: 電卓を作る、第 3...
http://www.ibm.com/developerworks/jp/java/library/j-scala...
***その他参考URL [#b752ea1d]
構文解析
http://sites.google.com/site/scalamemo/raiburari/parsing
第18回 Scalaとパーザコンビネータ(実装編)
Hello worldのサンプルがのっていてわかりやすいかもです。
http://itpro.nikkeibp.co.jp/article/COLUMN/20100526/348454/
Scala のパーサコンビネータで罠にはまった
http://d.hatena.ne.jp/thinca/20100119/1263837522
**字句解析とクラスについての考察 [#r4ef15da]
そもそも、トークンとはクラスとして置き換えることができそ...
たとえば正規表現でデータをマッチさせて、クラスを生成すれ...
*パーサ開発ソフトウェア [#j91f93e1]
wikiに掲載されていた一覧をのせておきます。
-ANTLR
-Bison
-Coco/R
-GOLD
-JavaCC
-Lemon Parser
-Lex
-LRgen
-Rebol
-SableCC
-Spirit Parser Framework
-Yacc
**JavaCC [#t4b674c6]
***JavaCCによる配列リテラルの表現 [#hbcb40c3]
Expression[] arrayLiteral() :{...}{
"[" [expression() ("," expression())*] "]" { ... }
}
Expression expression() :{...}{...}
ページ名: