はじめに
Spracheの一部を移植する形でパーサコンビネータを実装したと言うかしているのでそれについてです。
前回のはほとんどおもちゃですが、今回は違います。
燻製ニシンの虚偽
例によってあまり真っ当な動機でないのですが、以下の要件を満たすように実装しています。
- 単一のソースコードで動作
- Spracheと(ある程度の)互換性のあるAPI
- .NET4.0、Visual Studio 2010でビルド可能
で、使い方はとっても簡単。ParserCombinator.vbをコピーして適当な所に張り付けてあとは適当にビャーって書けば弊社的にはOKです。
Imports RedHerrings
Module Module1
Public Property Num As Parser(Of Integer) =
Parse.Regex("[0-9]+").Select(Function(it) Integer.Parse(it))
Public Property AddExpr As Parser(Of Integer) =
From a In Num
From add In Parse.PString("+")
From b In Num
Select a + b
Sub Main()
Console.WriteLine(AddExpr.Parse("1+2"))
End Sub
End Module
おわりに
ソースコードをそのまま放り込むタイプなので、足りない機能があればその場で追加できるというメガシンカにも匹敵するすごい事が出来るので、出来れば皆さんには真っ当なパーサコンビネータライブラリを使用していただけたらと思います。
ふざけたお話はここまでで、確かに弊社の必要に迫られて実装した面もありますが*1、何かとdisられがちなVBでなんらかの実績を作りたかったというのがあります。 (将来は分かりませんが)現状はVBはC#の言語仕様を遅れてはいますが追従してますし、VBでもこのようなライブラリを書けるというのを示したかったという感じです。
おわり
*1:だからあんなニッチな要件を設定している