前回は文法を定義する方法を書きました。今回は定義した文法で実際にパースしてみます。
まずはサンプルソース。
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行で書けます。
- 文法クラスのインスタンスを生成。
- 文法インスタンスを引数にパーサクラスのインスタンスを生成。
- パーサインスタンスのパーサメソッドに文字列を渡す。
たったこれだけです。
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 件のコメント:
コメントを投稿