読者です 読者をやめる 読者になる 読者になる

LINQでエラーコンビネータを作りたくて途方にくれる

前述のLINQベースモナドパーサーコンビネータ(id:ABA:20080919#p1)だが、パースに失敗したときに単にnullが返ってくるのがちょー使えねー。

ためしにカスタムインポーターに入れてみて、

[ContentImporter(".mml", DisplayName = "MiniML Importer")]
public class MmlContentImporter : ContentImporter<Term>
{
    public override Term Import(string filename, ContentImporterContext context)
    {
        MiniMLParserFromString parser = new MiniMLParserFromString();
        Result<string, Term> result = parser.All(GetAsString(filename));
        return result.Value;
    }

エラーのあるコンテント入れてビルドしたら、

Building content threw NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。

とか言うの。ダメダメだ。まあ元アーティクルにもそれは書いてあるのだが。

It's horribly inefficient, doesn't do error reporting, and doesn't support any form of error recovery.

たぶんOR演算子が両方にマッチしなかったときに単にnull返すのがまずいのだが、かといって例外上げるわけにもいかん。あるORが両方ダメだったとしても、その上位レベルのORでマッチすればいいので。

Parsec (http://www.lab2.kuis.kyoto-u.ac.jp/~hanatani/tmp/Parsec.html)のエラーコンビネータみたいのを追加したいのだが、どうすればうまくいくんだろう。