VB.NETでもパーサコンビネータを実装したい(その2)

はじめに

得意なことはC#ライブラリをVBに移植する事と、.NET4.5ライブラリを.NET4.0に移植する事。どうも弊社です

Dictionary(Of TKey, TValue)IReadOnlyDictionary(Of TKey, TValue)を実装するようになった系のコレクションのインターフェース実装の追加が地味にキツいです。 インターフェースの後刺しが出来ない以上、クラスを丸ごと置き換えないといけないのでいろいろアレがアレでマジファッキンって感じです。*1

とまぁ、別にこの件に関係無いのですがSpracheの一部を移植する形でパーサコンビネータを実装したと言うかしているのでそれについてです。

github.com

前回のはほとんどおもちゃですが、今回は違います。

燻製ニシンの虚偽

例によってあまり真っ当な動機でないのですが、以下の要件を満たすように実装しています。

で、使い方はとっても簡単。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

おわりに

ソースコードをそのまま放り込むタイプなので、足りない機能があればその場で追加できるというメガシンカにも匹敵するすごい事が出来るので、出来れば皆さんには真っ当なパーサコンビネータライブラリを使用していただけたらと思います。

ふざけたお話はここまでで、確かに弊社の必要に迫られて実装した面もありますが*2、何かとdisられがちなVBでなんらかの実績を作りたかったというのがあります。 (将来は分かりませんが)現状はVBC#の言語仕様を遅れてはいますが追従してますし、VBでもこのようなライブラリを書けるというのを示したかったという感じです。

おわり

*1:一番ファッキンなのは時代錯誤なフレームワークと開発環境を使わせる[削除済]

*2:だからあんなニッチな要件を設定している