ANTLRとPython

SublimeText2の色分けの仕組みを色々調べた結果、正規表現が基本で、それに特定の記号でタグを作るような仕組みがあるだけ。
サクラエディタやGinnieより若干複雑な色分けが出来るけど、インデント依存言語みたいに明確な開きカッコと閉じカッコの無い文法に対応しにくい。
そういうのもできなくはなさそうだけど、通常の色分けファイルだけでなくPythonでスクリプトを書く必要がある。

そうなると必要になってくるのが構文解析のプログラム。
得意ジャンルではないものの文法のチェックぐらいは何とか出来る。
ただPythonでそれをやったことはない。
本来Pythonで全部書く必要はなくて、SublimeLinterなんかを見ても大半はJavaScriptや実行ファイル等別ファイルの呼び出し扱いになってる。
ただ編集中のファイルをいったん保存してチェックというのがどうもスマートじゃなく、出来ればPythonのみで書きたい。

Python用のパーサジェネレータは色々あるみたいだけど、速度が遅かったり、日本語資料がほとんど無かったりで、使い方がさっぱりわからない。
そうこうするうちに汎用のパーサジェネレータのANTLRにPythonがあるらしいことがわかり、何度目かの再チャレンジ。

基本的な書き方はこれを参考に。
http://www.antlr.org/wiki/display/ANTLR3/Antlr3PythonTarget

…結局英語ではあるんだけど、ANTLR自体の話は日本語資料があるから、そういうのと照らし合わせながら進めると、なんとなくだいたいのところはわかる。

それでPaserとLexerの出力は出来るんだけど、今度はランタイムのバージョンが違うと言われる。
今の最新はAntlr4とAntlrWorks2だけど、Pythonに対応してないので、AntlrWork1.5(Antlr3.5内蔵)を使って、pythonのランタイムは公式からダウンロード出来る最新版の3.1.3を使用していた。
よく考えたらバージョンが違うんだから、違うと言われるのも無理はない。

それでGithubにあった3.5用のランタイムをダウンロードしてくる。
https://github.com/antlr/antlr3/tree/antlr-3.5

これでバージョンは一致したはずだけど、構文チェックを動かすと1文字めから不正な文字がある…っというのを連発される。
サンプルの文法を数種類試しても駄目で、ネットを見てるとAntlr3.5はそのままではPythonバックエンドが使えないという話を発見。AntlrWorks内蔵の物も同じことではないかと考えて、AntlrWorkの古いバージョンとランタイムを色々組み合わせて、ようやく正しく動作する組み合わせを発見。
AntlrWorks1.4.3+Antlr3.4用のランタイムで、正しく構文解析と字句解析が出来るようになった。
ランタイムの方は3.5用でも問題ないというか、3.4のまま変更されてないからエラーになってたというか。

確かにANTLRはPythonに対応してるけど、必ずしも全てが最新版に常時アップデートされているわけではない様子。
ただ他の言語用では一部使えない機能があったりするけど、Pythonバックエンドは割りと色々対応していて、有効に使える方だと思う。
基本的のところではやっぱりJava用なんだろうけど。

Antlr4の新機能が使えないのは残念だけど、とりあえずはこれで必要な物は作れそう。

6/24追記
上記の方法で動きはするけど、微妙な所がちょこちょこおかしい。
文法によってelifと出るはずの箇所でelとifが改行を挟んで分離したり(ANTLR3.4のバグらしい)、文法エラーが起きた時のメッセージが変だったり。
Pythonで使うのはあまりオススメ出来ない感じ…
posted by unaunagi at 2013/06/18 15:42 | Comment(0) | TrackBack(0) | デジタル>プログラム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/366747293
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。