Haskell:data.attoparsec.char8.sepby入力文字列が空のときに停止する方法は?

StackOverflow https://stackoverflow.com/questions/3837229

  •  27-09-2019
  •  | 
  •  

質問

次のHaskellコードを書きました

import Data.Attoparsec (Parser)
import qualified Data.Attoparsec.Char8 as A
import qualified Data.ByteString.Char8 as B

someWithSep sep p = A.sepBy p sep

コードはこのように動作すると仮定しています。

main*> A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89"
Done "" [123,45,67,89]

しかし、上記のコードのようにsomewithsepを定義したので、私は常に次の動作を受け取ります。

main*> A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89"
Partial _

破損したエントリを提供しない限り:

main*> A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89f"
Done "f" [123,45,67,89]

どうすればこれを修正できますか?

返信に感謝します

役に立ちましたか?

解決

Partial コンストラクターは故障を示していません。単に、それを望むなら解析が続くことができるということです。部分的なアイテムを取り、空のバイテストリングに供給する必要があります(ドキュメントに従って: http://hackage.haskell.org/packages/archive/attoparsec/0.8.1.0/doc/html/data-attoparsec-char8.html#t:result)最終結果を取得します。

それが機能することを示すために:

> let A.Partial f = A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89" in f B.empty
Done "" [123,45,67,89]

もちろん、おそらく他のケースを処理するために最終的にケースステートメントが必要です。

他のヒント

attoparsecは複数のピースで入力を受け入れます。 1つは最初の作品を与えます 解析, 、次に結果を与えます 解析 そして、2番目の作品 , 、次にその結果を与え、3番目のピースに 繰り返しますが、

入力の終わりをマークするために、空の文字列をパーサーに送信します。

A.feed (A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89") B.empty
Done "" [123,45,67,89] 

または、data.attoparsec.lazyを使用します。ここで、怠zyな文字列はあなたのために入力の終わりを処理します。

import qualified Data.Attoparsec.Lazy as L
import qualified Data.Attoparsec.Char8 as A
import qualified Data.ByteString.Lazy.Char8 as B
L.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89"
Done "" [123,45,67,89] 

(参照も参照 この関連するスタックオーバーフローの質問)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top