スニペットって、短いプログラムのようなものをコンパイルすることだとかんがえると、 構文解析器をつかったほうが、高機能なものをつくれるのではなかろうか。 そんなことを考えました。 だったら、antlrをつかってスニペットツールってつくれないものだろうか とおもって、チャレンジしてみることにしました。
だらだらとかいてあり、さらにわるいことにこの資料は未完成です。すいません。
スニペット用のキーワード(引数1、引数2)
調べるまでの道筋をメモしながらやっていく。
とりあえず本家をみてみます。
Getting started with ANTLR v3をみてみよう。
http://www.antlr.org/wiki/display/ANTLR3/FAQ+-+Getting+Started
コマンドラインから動かす方法があるではないか。
http://www.antlr.org/wiki/pages/viewpage.action?pageId=729
ちかごろ、コマンドラインもいいかなーっておもってきたんだよね。
えっこんなんでいいの?
java -jar antlr-3.1.2.jar mygrammar.g
ためしに、サンプルを動かしてみる。
http://www.antlr.org/download/examples-v3.tar.gz
クラスパスの設定いるじゃん。org/antlr/Toolが必要とかいうエラーだ。
よくわらないので、本家
http://www.antlr.org/download.html
からダウンロード、おっと、ANTLRWorksをダウンロードしてしまった。
実行してから気がついた。
文法表現でよく使う、表現がチェックボックスで選択できるようになっているのはありがたい。
どうやらComplete ANTLR 3.4 Java binaries jarをダウンロードしてくるべきだったみたい。
あれ、JavaScript? runtime distributionってのもあるぞ、Javascriptで動くバージョンかな?
展開すると4つのjsファイルがでてきましたよ。ソースみてみるとSafariで動作確認したと、コメントにかいてある。
これって、これがあればブラウザで構文解析可能になるっていうことだろうか?コンパイルとかの手順ってやっぱいらないんだろうか?
いつか調べてみたいが、勝手にダウンロードしちゃいけない作業場所では、すでに、antlrは何らかの形で導入されていることがおおいから、こっちを先にしらべてみたい。
Sampleコードをダウンロードしてみることにした。
解凍してみると、Javaとか、Pythonとか、XMLとか、計算器とかの構文解析例が載っている。。。
見慣れないフォルダ名もあるが、inputってファイルをみると、解析対象がわかる。
たとえば、fuzzyのinputファイルを除くとこんなかんじ
import org.antlr.runtime.*; public class Main { public static void main(String[] args) throws Exception { for (int i=0; i<args.length; i++) { CharStream input = new ANTLRFileStream(args[i]); FuzzyJava lex = new FuzzyJava(input); TokenStream tokens = new CommonTokenStream(lex); tokens.toString(); //System.out.println(tokens); } } }
simplecTreeParser?ならばinputファイルは
char c; int x; void bar(int x); int foo(int y, char d) { int i; for (i=0; i<3; i=i+1) { x=3; y=5; } }
こんなかんじだ。
一番ちいさいのは、hoistedPredicatesフォルダのサンプルで、次は、importフォルダかな。
一番小さいのは、基本がよく分かるので大好きだ。だからこのサンプルから学んでいくことにした。
文法ファイルはT.gだとおもうので、なかをみてみる
System.out.println()でくくられた中身をスニペットしたいものに置き換えればいいっておもった。
スニペットに反応させるキーワードは、
stat: identifier {System.out.println("enum is an ID");} | enumAsKeyword {System.out.println("enum is a keyword");} ; enumAsKeyword : {enableEnum}? 'enum' ;
のenumAsKeyword?に関連する箇所を自分で追加したい分だけ増やせばいいのではないかとおもった。
とりあえず、大体はあくしたから、動かしてみる。
T.gファイルをみると、コメントに
Run "java org.antlr.Tool -dfa t.g" to generate DOT (graphviz) files.
と、かいてある。org.antlr.Tool ってなんだ?
antlr-3.4-complete-no-antlrv2.jarを拡張子をzipに変換して解凍してみる。あった、あった、classファイルがあった、つまり、コンパイルされている状態で格納されていました。
これを使うようにするには、同じディレクトリに置くとかすればいいのかな。
やってみたコマンド
java -jar antlr-3.4-complete-no-antlrv2.jar t.g
結果
error(8): file t.g contains grammar T; names must be identical
エラー orz
こんな簡単なサンプルさえ動かせないなんて。。。 正解はこちら
java -jar antlr-3.4-complete-no-antlrv2.jar T.g
ファイルの大文字と小文字をきっちり合わせないとだめなんですね。
Javaのソースコードがでてきた。
javac -cp antlr-3.4-complete-no-antlrv2.jar Main.java TLexer.java TParser.java
java -cp .;antlr-3.4-complete-no-antlrv2.jar Main input
おおっenum is anIDって出た。