今日、SpartというC#のライブラリを試してみました。
Spartはパーサジェネレータの一種で、元々はC++のboostライブラリに含まれているSpiritというライブラリをC#に移植したモノです。このライブラリで面白いのは、これを使ったコードの「見た目」です。次に、apple、orange、grapeの3単語を空白で区切られた文字列を解析し、見つけた単語を順番にコンソールへ表示する簡単な例を記してみます。非常にいい加減な例ですが。
// セマンティックアクションを定義
ActionEventArgs writeToConsole = delegate( object sender, ActionEventArgs e ) {
Console.WriteLine( e.Value );
};
// 文法を定義
Rule sentence = Ops.OneOrMore(
Ops.Sequence(
Prims.Str("apple") [writeToConsole]
| Prims.Str("orange") [writeToConsole]
| Prims.Str("grape") [writeToConsole]
, Ops.ZeroOrMore(Prims.Whitespace)
)
);
// パース
sentence.Parse( ... );
C#のコードなのに、文法規則を定義するコードがBNF風になります。特にセマンティックアクションをインデクサのオーバーロードで記述する、というアイデアはすごいなぁと感心しました。私には考えつかないですね(苦笑)。
ここ一年ぐらいパーサジェネレータを探してきましたが、見つけたモノの良し悪しは結局使ってみることでしか分からないんですよね。そうと分かっていながらも、時間などの都合で手がナカナカ出せていなかったなぁと思います。今日は久しぶりに(自分にとって)新しい技術に触れる機会が得られて良かったです。