C#のパーサジェネレータ Ironyを使ってみた。その1。 | 妄想プログラマのらくがき帳

2012年10月8日月曜日

C#のパーサジェネレータ Ironyを使ってみた。その1。

C#で簡単に使えるパーサジェネレータってないかな~と探していたところ、
Ironyが結構良さげだったので試しに使ってみました。

IronyはオープンソースのLALR(1)パーサジェネレータで、CodePlexで公開されています。
Irony - .NET Language Implementation Kit

Ironyの大きな特徴として、C#のコードで文法を定義できるという点があります。
下記のコードは、Irony - .NET Language Implementation Kitにあるサンプルの一部ですが、
こんな感じでC#で自然に文法を定義できます。

// 2. Non-terminals
var Expr = new NonTerminal("Expr");
var Term = new NonTerminal("Term");
var BinExpr = new NonTerminal("BinExpr", typeof(BinExprNode));
var ParExpr = new NonTerminal("ParExpr");
var UnExpr = new NonTerminal("UnExpr", typeof(UnExprNode));
var UnOp = new NonTerminal("UnOp");
var BinOp = new NonTerminal("BinOp", "operator");
var PostFixExpr = new NonTerminal("PostFixExpr", typeof(UnExprNode));
var PostFixOp = new NonTerminal("PostFixOp");
var AssignmentStmt = new NonTerminal("AssignmentStmt", typeof(AssigmentNode));
var AssignmentOp = new NonTerminal("AssignmentOp", "assignment operator");
var Statement = new NonTerminal("Statement");
var ProgramLine = new NonTerminal("ProgramLine");
var Program = new NonTerminal("Program", typeof(StatementListNode));

// 3. BNF rules
Expr.Rule = Term | UnExpr | BinExpr | PostFixExpr;
Term.Rule = number | ParExpr | identifier;
ParExpr.Rule = "(" + Expr + ")";
UnExpr.Rule = UnOp + Term;

また、ライセンスはMITライセンスなので、著作権・無保証の明示をしておけば利用や改変は自由です。
ちなみにIrony - .NET Language Implementation KitのSystem Requirementsに
>>Windows 7, .NET Framework 4.0, Visual Studio 2010
とありますが、VistaやVSExpress2010でも使えます(XPは確認していませんが、たぶん使えます)。

さてIronyの使い方ですが、まずはCodePlexのページのDOWNLOADSからzipファイルを落としてきます。
zipファイルの中にはIronyのソリューション一式が入ってるので、ソリューションを開きます。

※このときVSがExpressの場合、テスト関係のプロジェクトなど一部のプロジェクトが開けませんが、
 Ironyを使うだけなら問題ないです。ソリューションを開くごとにメッセージが表示されるので、
 うっとおしい場合は(利用不可)となっているプロジェクトをソリューションから削除しとくと楽です。

ソリューションが開けたら、ビルドを行いIrony.Dllを作成します(Irony\bin\Debug[or Release]に出力されます)。
この出来上がったDllを、パーサを使いたい(作りたい)プロジェクトの参照に追加したら準備完了です。

今回はここまで。次回は文法の定義の仕方について書きます。

0 件のコメント:

コメントを投稿