2013-05-16 7 views
10

何らかのカスタムタイプの解析エラーを何とか取得できますか?たとえば、エラーからコンテキストを解析することについてのより多くの情報を得ることはクールです。そして、テキストメッセージの形でエラー情報を持つのはあまり便利ではないようです。Parsecとカスタム解析エラータイプ

+1

これは可能ではないようです。 ['Text.Parsec.Error'](http://hackage.haskell.org/packages/archive/parsec/3.1.1/doc/html/Text-Parsec-Error.html)は、あらゆる種類のエラーレスポンスは最終的に 'String'であり、['() '](http://hackage.haskell.org/packages/archive/parsec/3.1.1/doc/html/Text-Parsec-Prim.html #v:-60--63--62-)演算子は文字列のみをとります。 –

+0

注意点:エラー出力は「単なるテキストメッセージ」ではありません。これにはソースの位置と、次にパーサーが期待していた情報などが含まれています。しかし、はい、時にはそれ以上を得ることはいいです... – MathematicalOrchid

答えて

8

Rhymoidが観察するように、残念ながら、直接には不可能です。あなた自身のEither様モナドでParsecを組み合わせる

も、助けにはなりません - それは(オーバーEitherT)をあまりにも早く(Eitherオーバー)を終了するか、遅すぎます。

もしあなたがそれを悪くしたいなら、あなたはをState (SourcePos, YourErrorType)以上に使ってください。

構造化されたエラー値を出力するたびに、現在の場所の状態で記録しますが、の場合のみ(これはエラーが返されるため、Parsecのユーザー状態は使用できません)現在の場所はすでに記録されている場所よりも遠いです。 (場所が同じであれば、何とかエラーをマージすることができます)

最後に、モナドスタックを実行すると、 SourcePos。 2つの場所が一致していることを確認してください。そうでない場合(つまり、ParsecのSourcePosが遠い場合)、このエラーのエラー値はありません。