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

2012年10月11日木曜日

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

前回に引き続き、Ironyについてです。

前回は文法を定義する方法を書きました。今回は定義した文法で実際にパースしてみます。

まずはサンプルソース。
string src =
    "a = 10;" +
    "b = 20;" +
    "c = a + b;" +
    "c *= c;";

MyGrammar grammar = new MyGrammar();
Parser parser = new Parser(grammar);

ParseTree parseTree = parser.Parse(src);
MyGrammarは、前回定義した文法クラスです。
ご覧のとおり、パース処理自体は3行で書けます。

  1. 文法クラスのインスタンスを生成。
  2. 文法インスタンスを引数にパーサクラスのインスタンスを生成。
  3. パーサインスタンスのパーサメソッドに文字列を渡す。

たったこれだけです。
Parser.Parse()の戻り値であるParseTreeはASTになってます。
ParseTree.RootがASTのルートノードで、子ノードがParseTree.Root.ChildNodesに繋がっています。
このASTは様々な情報を持っているので、あんなことやこんなことに使えちゃいます^^

ParseTree.Root変数がnullの場合、パース失敗です。
パースエラーに関する情報は、ParseTreeクラスのParserMessages変数で得ることができ、
エラーとなったソース上の場所はParseTree.ParserMessages[ ].Location、
修正候補のリストはParseTree.ParserMessages[ ].ParserState.ExpectedTerminalsで取得できます。

Ironyを使ってみて感動したのは、凄く簡単に使えるようになる!ということです。
他のパーサジェネレータなどを使うには、文法定義に専用の文法を覚えないとダメな場合が多いですが、
IronyはBNFとC#の文法が分かっていれば、すぐに文法定義ができるようになります。

日本語の資料がほとんど無いのが難点ですが、C#でパーサジェネレータが必要な方は是非使ってみてください!

0 件のコメント:

コメントを投稿