つれづれなるままにANTLRをやる。
もう、インストール済みなので、
立ち上げると,[Grammar Name:]を聞かれる。
あ、何するかきめてなかった。
なにか目標をたてよう。
そうだ、 入力:
y == x
出力
strcmp(x,y)
これていいや、文法名はLesson01とかでいいかな、
とおもったけど、ファイル名に小文字があると駄目っぽい。とりあえずGGGとかいう、てきとーな名前にした。
Lexical Itemsでチェックボックスを入れることができる。 Identifierは、たぶん、識別子だから、イコールとか使えるようになるのかな? 変数は、Characterかな?、不要なスペースもキャンセルしたいから、White spaceにもチェックを入れておけばいいのかな。
とりあえず、仮説をたててやってみると、いいかもね。 すると、デフォルトでコードがいくつか作られている。
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; WS : ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;} ; CHAR: '\'' ( ESC_SEQ | ~('\''|'\\') ) '\'' ; fragment HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; fragment ESC_SEQ : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') | UNICODE_ESC | OCTAL_ESC ; fragment OCTAL_ESC : '\\' ('0'..'3') ('0'..'7') ('0'..'7') | '\\' ('0'..'7') ('0'..'7') | '\\' ('0'..'7') ; fragment UNICODE_ESC : '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT ;
たしかに、初めて利用する場合、このように、よくある選択肢を選ぶようになっているのは、ありがたい。
とりあえず、デバックボタンを押してみる。
ありゃ、エラー
[10:46:05] java.lang.NullPointerException at org.antlr.xjlib.foundation.XJUtils.concatPath(XJUtils.java:43) at org.antlr.xjlib.foundation.XJUtils.concatPath(XJUtils.java:54)
対策がネットに載っていた、コンパイラーが通っていないかららしい。 You can fix this by going to File > Preferences > Compiler and entering the path for the executable.
って書いてあったが、Macの場合は[ANTLRWorks]-[環境設定]-[Preferrences] でたどれた。
コンソールにて
which java
で、どこにインストールされているか調べてみた。
/usr/bin/java
ってでてきた。 それを入れれば、動いたけれども、なんだかうまく動かない。
antlr-3.2.jar
をクラスパスに指定したりしてみたりしたら動いた。
とにかく、IDの書き方はいままで、
ID : 'a'..'z'+;
しかしらんかったのだけど
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
でもいけるということがわかった。
空白文字の書き方も
WS : (' '|'\n'|'\r')+ {$channel=HIDDEN;};
しか知らなかったけど
WS : ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;} ;
と書けることもわかった。こっちの方が見やすい。
1改善づつできることを、地道に増やしていくのが、近道かもね。
IDって、複数回マッチした場合どうなるんだろう?