*目次 [#qdd2518b] #contents *趣旨 [#ia584f6a] 寝る前に、眠くなるまで つれづれなるままにANTLR4を独学する *はじめに [#w690b0fa] 久しぶりに、ANTLRをやってみたくなった。 ANTLR3もくわしくわからなかったのだが、 ANTLR4では、ビジターにアクションを書くように思想が変わったそうだ。 英語のわかる人は、是非このツールの使い方を翻訳していただきたいとおもいます。 *目標 [#n3c729fb] もう、寝る時間なので、四則演算のチュートリアルができたらいいな。 *インストール [#zf49247e] 新しいのを入れてみようと思う。 今は、2014/04/30 です。 **URL [#ha074472] http://www.antlr.org/download.html 下記のをダウンロードしてみました。 Complete ANTLR 4.2.2 Java binaries jar *チュートリアル(Getting Started with ANTLR v4) [#q0621120] 次のステップということで Getting Started with ANTLR v4 を見てみる。 アドレスは https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4 **だが断る [#o1dd46cf] クラスパスに通すやり方が書いてあるが、コマンドラインベースのやり方が書いてある。 自分はエクリプスを使ってやりたい。そんなお年頃。 クラスパスの設定は、エクリプスのビルドパスを通すってことで代用できるはず。 エイリアスの指定は、クラスをそのまま指定して、mainメソッドを呼べばいいじゃん。 public static void main(String[] args) { org.antlr.v4.Tool.main(args); } こんな感じでやることにする。 ANTLR Parser Generator Version 4.2.2 -o ___ specify output directory where all output is generated -lib ___ specify location of grammars, tokens files -atn generate rule augmented transition network diagrams -encoding ___ specify grammar file encoding; e.g., euc-jp -message-format ___ specify output style for messages in antlr, gnu, vs2005 -long-messages show exception details when available for errors and warnings -listener generate parse tree listener (default) -no-listener don't generate parse tree listener -visitor generate parse tree visitor -no-visitor don't generate parse tree visitor (default) -package ___ specify a package/namespace for the generated code -depend generate file dependencies -D<option>=value set/override a grammar-level option -Werror treat warnings as errors -XdbgST launch StringTemplate visualizer on generated code -XdbgSTWait wait for STViz to close before continuing -Xforce-atn use the ATN simulator for all predictions -Xlog dump lots of logging info to antlr-timestamp.log となった、オプションだらけじゃん。英語だし。 これをラップして設定メソッドに日本語のコメントを書いておいたほうが、日本人にやさしいと思うの。 encodingオプションの例に、euc-jpとあるあたりが、日本への愛を感じる。 **Helloをやってみる [#j06e9215] チュートリアルにつきものであるといっていい、Helloが用意されている。 これをやってみる。ことにする。 プロジェクト直下にresourceというフォルダを作って、 そこに https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4 にある Hello.g4 を入れてみた。 それと、あとでわかるんだが、これを実行すると、ファイルがたくさん出てきてしまうんだが、あらかじめ場所をきめておいたほうがいい。 だからここではパッケージ名にantlr.サンプル名を作成することにする。 エクリプスでやるなら次のような感じで実行してみるといい。 public static void main(String[] args) { String[] argList = {"./resource/Hello.g4","-o" ,"./src/antlr/hello","-package","antlr.hello"}; org.antlr.v4.Tool.main(argList); } 実は、はじめ、チュートリアル通りにやってみようとおもって String[] argList = {"./resource/Hello.g4"}; としていたんだ。 するとプロジェクト直下に、いろいろ吐き出してしまった。 出てきたソースコードにはパッケージ名も書いていない。 だから、出力先と、出力したファイルがすぐにエクリプスで編集できたらいいかとおもって、 String[] argList = {"./resource/Hello.g4","-o" ,"./src/antlr/hello","-package","antlr.hello"}; としたんだ。 **パースさせてみる [#j476f375] 標準入力を使ってテストさせることができるようだ。 エクリプスからやるには、次のようにやればいいことがわかった。 try { String[] grunArgList = {"antlr.hello.Hello","r","-tree"}; org.antlr.v4.runtime.misc.TestRig.main(grunArgList); } catch (Exception e) { e.printStackTrace(); } チュートリアルはキーボード入力を使っているようだが、 gui表示のオプションを指定するとecllipseからは、ctrl + z で抜けられなかった。 しらべてみたら、ファイルでの入力もできるようだ。 ソースコードの引数をみたからわかったんだ。 入力ファイルを ./resource/hello.txtに作った。 try { String[] grunArgList = {"antlr.hello.Hello","r","-gui","./resource/hello.txt"}; org.antlr.v4.runtime.misc.TestRig.main(grunArgList); } catch (Exception e) { e.printStackTrace(); } これで、チュートリアルはこんな感じで終わり。 これで、Helloのチュートリアルはこんな感じで終わり。 今日はこの辺でねるとする。