2013年12月2日月曜日

TinyPG(a Tiny Parser Generator) その2

ちょっと間が空きました。TinyPGの続きを。

構文解析ツールの中でもTinyPGが良いと思うところは、定義した構文解析の処理をC#またはVBのソースコードで生成してくれることです。アプリ開発で構文解析機能を作る場合、専用のライブラリを用意する必要は無く、TinyPGで生成したソースコードを組み込めば実現できるわけです。

ソースコードの生成

前回の続きになります。
前回で構文解析したときに(メニューでBuildを実行したら)、実はソースコードが生成されています。
構文解析定義の@TinyPGの行に定義してある設定に従い生成されています。



Languageには"C#"か、"VB"が指定できます。生成するソースコードの言語の種別です。
OutputPathにはソースコードの生成パスを指定します。ちなみに、末尾に¥を付加しないと最後の¥から末尾までをファイル名として生成します。つまり上記の画像の設定ではC:¥配下にwork***.csのようなファイルを生成します。

さて、OutputPathで指定したパスにソースコードが4ファイル生成されているはずです。
それぞれ以下の機能を持ちます(LanguageがC#の場合)。

Parser.cs、Scanner.cs、ParseTree.cs
解析対象の文字列を読み込み・解析・分解・生成(コンパイル)します。

TextHighlighter.cs
解析対象の文字列を解析し、構文解析定義に定義した配色設定に従った情報を生成します。TinyPGで構文解析すると、Expression Evaluatiorにある文字列が構文解析定義の記述に従い配色されますが、その仕組みをC#ソースにしたものです。
RichTextBoxで使用可能な配色情報を用意します。

アプリケーションへの組み込み

実際にアプリケーションに組み込みます。
上記のソースコードをC#プロジェクトに組み込んだ後、以下の記述を実行したい箇所に記述します(以降、必要なusingは省略しています)。
// 解析したい文字列
string input = "... your expression here ...";
// 解析
// 結果はParseTreeに格納される
Parser parser = new Parser(new Scanner());
ParseTree tree = parser.Parse(input);
これで任意の文字列を解析できます。
TextHighlighter.csについては以下のような記述を行います。
// 解析したい文字列
string input = "... your expression here ...";
// 解析処理のインスタンス生成
Scanner scanner = new Scanner();
Parser parser = new Parser(scanner);
// 表示させたいrichTextbox、各インスタンスを指定する
TextHighlighter highlighter = new TextHighlighter(richTextbox, scanner, parser);
解析したい文字列への配色が不要ならば、上記は記述しなくとも解析自体は可能です。

解析結果

解析結果はParseTreeクラスに設定されます。PaeseTreeクラスは木構造に従い再帰的に子を持ちます。TinyPGのOutputにあるParse Tree表示と同様のデータ構造です。
詳しくはまた次回。。。

ソレデハ。 

0 件のコメント:

コメントを投稿