つれづれなるままに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って、複数回マッチした場合どうなるんだろう?

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS