しばらく前に、ちょっとAS3で書かれたプロジェクトのソースを読んで、あわよくばC#に移植できないかと思って、一度ちまちまとironyでActionScript3のパーサを書いて、その後ずっと放置していたのだけど、最近になってまた同じ事をやりたくなってきて、作りかけで放置していたパーサに手を入れ始めた。ちょくちょくgistには置いていたのだけど、だんだんソースが増えてきて、というか複数ファイルになってきたので、作りかけでもいいからと思ってリポジトリを作って公開することにした。
まともなパーサとしては機能していなくて、ありもののAS3のソースを解析してエラーが出ていないという程度の代物なのだけど、とりあえずこれでC#のソースが生成できれば、個人的なニーズは満たしている。そもそも未だトークン解析しかできないので、これを実行して得られるものは何もない。これからParseTreeを元にASTを構築して、それからさらにC#のコードに変換するという作業が必要になる。AS3は複雑な文法をもたないので、その機能は概ねC#にコンバートする部分で(構文上は)苦労することが無さそうだ。
コードパーサはironyを使うことにしたが、一度、ironyのAPIがほとんどドキュメントされていないことから、使い慣れたjayに移行しようとして、コードも2000行ばかり書いたのだけど、ironyで問題なく通っているトークン解析の次元で、こちらではハマりそうだったので(トークナイザを自作しなければならなかったし、文法トークンが全てintに置き換わるので実行効率が良くてもコーディング効率が悪く、キャストを頻用するので実行時エラーにも多々悩まされる)、これは泣く泣く捨ててironyで何とかすることにした。ほとんど何も分からなかったAST生成の部分にも多少慣れてきたので、あと肉体労働さえすれば、そのうち出来上がるだろうと思う。
ironyでAS3の文法やJavaScriptの文法を実装する上で面倒なのは、改行でセミコロンを省略できるという部分で、そのせいかIronyにはC#やPythonのコードパーサはあっても、JavaScriptの例は無い。IronJSというJavascript実行環境のプロジェクトがあるので、あわよくばコードを流用してやろうと思って、ソースを見てみたら、(本体がF#で書かれていてびっくりしたということもあったのだけど、)どうやらantlrを使っているようだった。antlrに依存するようになると、それはそれで面倒なので、今回はパスすることにした。
そんなわけで(?)、セミコロンを省略するような表記にはまだ対応できていない。Ironyでは、解析したトークンに対してTokenFilterというものを使うと、ある種のトークンの並びを置き換えることが出来そうなのだけど、まだ使い方がよく分からない(合うのかどうかも分からない)ので試していない。
今回は、ちまちました個人的なニーズの割には、このツールで実装する内容が面倒なので、実用品が出来上がるまで、もうしばらくかかりそうだ。
Leave a comment