tsukasaスクリプトをC#コードに変換するトランスパイラを作っています。当初はrubyのparsletで書こうと思っていたのですが、parsletが気軽に動かせる代わりに字句解析器と構文解析器が分離していない点や、C#のプロジェクトに統合できない点から中止し、ANTLR4を使うことにしました。
ANTLR4はJava製のパーサージェネレーターで、C#用のコードも生成できる上に、VisualStudio上でシームレスに動作させるプラグインまで用意されています。これは簡単! ……という感じにはいかず、ひとまず動くまでかなり苦労したのでメモ(いずれちゃんと一つの記事にします)。
基本はこちらの記事の流れでいけば動きます。
(01)ANTLR4をC#で使ってみる
https://sites.google.com/site/hobbyprogrammingroom/game/gamescript/01
・メニューの「ツール>拡張機能と更新プログラム」から「ANTLR Language Support」を検索してインストール
・任意の新規プロジェクトを作成した状態で、メニューの「ツール>Nugetパッケージマネージャー>ソリューションのNugetパッケージマネージャー」から「参照」タブを選び、Antr4とAntr4.Runtimeをプロジェクトにインストール
・ソリューションエクスプローラで「ANTLR4 Combined Grammar」を追加する時は、プロジェクト名が書かれたノードあるいは配下のフォルダを右クリックする(ソリューション名のノードや未選択ではNG)。
注意点
・コードの実行には"using Antlr4.Runtime;"が必要。
・*.g4のファイルを上書き保存すると、自動的にANTLR4がコードを生成し、obj/debugフォルダ配下にコードを配置する。
・生成されたコードはpartialクラスの定義として自動的に参照されているので、obj/debugのファイルはそのままで良い
・サンプルコード中にある"parser.r()"というメソッドは、グラマーの規則にある"r : 'hello' ID ; "のこと。コードが生成された後に呼び出し可能になる。
C#用のパーサジェネレーターライブラリがなかなか見つからず、ANTLR4が動くのはとても嬉しいです。が、あまりにも日本語の情報が無いので、できるだけ記事を書きたいと思っています。
参考URL
ANTLR 4 Documentation
https://github.com/antlr/antlr4/blob/master/doc/index.md
C++でANTLRを使う
http://cx5software.com/article_antlr/
VS用プラグインのマニュアル
https://github.com/tunnelvisionlabs/antlr4cs
The ANTLR mega tutorial (長すぎてビビるチュートリアル)
https://tomassetti.me/antlr-mega-tutorial/
Getting started with ANTLR in C#(上記と同じブログのC#版解説)
https://tomassetti.me/getting-started-with-antlr-in-csharp/
ANTLRWorks(開発終了しちゃった?)
http://www.antlr3.org/works/
ANTLR4 grammar syntax support(未調査。精力的に更新されているように見える→と思ったけどこれVSCodeのツールだった……)
https://marketplace.visualstudio.com/items?itemName=mike-lischke.vscode-antlr4
追記
ちゃんと調べてないんですが、vs2017ではANTLRのサポートがまだまともに出来ていないのか、少なくともANTLR Language Supportがインストールできません。仕方ないのでvs2015をインストールしたんですが、ダウンロードまでの階層がやたら深い上に、事前にVisual Studio Dev Essentialsに参加しないと旧バージョンのダウンロードにアクセスできないようで、結構大変でした><。同じ事やる人はお気をつけくださいー。