2010-10-01 57 views
3

我已经写了下面的Haskell代码Haskell:如何在输入字符串为空时停止Data.Attoparsec.Char8.sepBy?

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] 

我该如何纠正?

感谢回复

回答

5

Partial构造并不代表失败,只是如果你希望它是解析可以继续。您应该接受部分项目并为其提供空的ByteString(按照文档: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] 

当然,你可能想在结束了一个case语句来处理其他案件。

+0

附录:attoparsec中的'feed'函数也可以用来提供空字符串,所以你也可以使用:'A.feed(A.parse(someWithSep A.skipSpace A由Matchi.com提供回到cimal)$ B.pack“123 45 67 89”)B.empty' – 2010-10-01 09:16:42

2

attoparsec接受多个部分的输入。一个给人的第一片到解析,然后从解析给出结果和所述第二片到饲料,然后给出结果和所述第三片到饲料再次,依此类推。

你喂解析器一个空字符串标记输入的结束:

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,其中懒字符串处理输入你的结尾:

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] 

相关问题