【问题标题】:Haskell : how to stop Data.Attoparsec.Char8.sepBy when input String is empty?Haskell:当输入字符串为空时如何停止 Data.Attoparsec.Char8.sepBy?
【发布时间】:2010-10-01 07:29:03
【问题描述】:

我编写了以下 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]

我该如何纠正这个问题?

感谢回复

【问题讨论】:

    标签: parsing haskell attoparsec


    【解决方案1】:

    Partial 构造函数并不表示失败,只是如果您愿意,解析可以继续。您应该获取 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 语句来处理其他情况。

    【讨论】:

    • 附录: attoparsec 中的feed 函数也可以用于事后提供空字符串,所以你也可以使用:A.feed (A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45 67 89") B.empty
    【解决方案2】:

    attoparsec 接受多个部分的输入。将第一部分提供给 parse,然后将 parse 的结果和第二部分提供给 feed,然后将结果和第三部分提供再次feed,以此类推。

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

    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] 
    

    (另见this related Stack Overflow question

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      相关资源
      最近更新 更多