読者です 読者をやめる 読者になる 読者になる

MGrammarでIDLをパースしてみた

.NET

最近、IDL(Interface Definition Language)をパースする必要があって、JavaCCCSか、Monoのjayを使おうかと思っていたんですが、MGrammarなるものの存在を知ったので試しに使ってみました。

ufcppさんの記事をかなり参考にさせていただいております。


今回作成したIDL用の文法定義ファイルがこれ。

このidl.mgファイルを使って、test.idlをパースすると、test.xamlのようなXAMLが生成されます。

IDLの文法については、OMGIDL Syntaxand Semanticsなどを参考にしました。ただし、CCMとか新しい文法には対応していませんし、COMの拡張にも対応していません。

しかし、IDLっていろんな言語マッピングがあるのにC#はないんですな。

今後はこの結果を使って、C#VBのコードを自動生成したいと思っているんですが、やはりCodeDOMを使うのが良いのかなー。

はまりどころ

"<"の扱い

ufcppさんも書いてますが < の解析が微妙。sequenceとかstring<10>は解析できるのに、#includeみたいなのは解析できていません。謎です。

XAMLの生成に失敗

mgxコマンドでM言語を出力するとうまくいくのに、XAMLを指定すると“オブジェクト参照がオブジェクトインスタンスに設定されていません”というエラーが出て落ちることがあります。
このエラーは Arguments { } のような空の要素があると出たりしますが、出ないこともしばしば。

あいまいな定義

パースするときに、以下のような警告がでることがあります。これは定義があいまいなために出る警告なので precedence で優先度を設定すると良いようです。

warning: This input has more than one valid interpretation base on the grammar. Please see the MGrammar Language Specification to learn how to resolve ambiguities.