2016-08-04 1 views
1

attoparsecパーサー、xがあるとします。attoparsecパーサーをパーサーに変換する。消費するバイト数が特定の長さでないと失敗するパーサー

私はy = f n xならば、そのようなことを、機能f :: Int -> Parser a -> Parser aを作成するために探しています:

  • yx
  • を失敗した場合にxが成功したとxnバイト
  • yを消費しない場合yが失敗した失敗しました他の場合は成功する

これをどうやってやりますか?

答えて

5

あなたはそれを実装するためにmatchを使用することができます。

f n x = do 
    (bs, res) <- match x 
    guard (BS.length bs >= n) 
    return res 

あなたはこれが重い使用にそれを置く前に、許容可能な方法で(<|>)と相互作用することを確認する必要があります。

+0

「バイナリ」では、この関数は 'isolate 'としてパッケージ化されています。おそらく、バイナリは消費されたバイト数を追跡​​するので、おそらくそれはもっと賢明ですが、Attoparsec APIの良い追加機能として私を襲います(トークンはバイトではないため、テキストはバイト数をカウントしません)。 –

関連する問題