前述の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)のエラーコンビネータみたいのを追加したいのだが、どうすればうまくいくんだろう。