微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

切片用attoparsec

如何解决切片用attoparsec

我正在从attoparsec文档中查看this example

simpleComment   = string "<!--" *> manyTill anyChar (string "-->")

这将构建[Char]而不是ByteString切片。带有大量评论不是很好,对吧?

另一种选择,takeWhile

takeWhile :: (Word8 -> Bool) -> Parser ByteString

不能接受解析器(即不能匹配ByteString,只能匹配Word8)。

是否有一种方法可以使用attoparsec解析ByteString的块,而无需在过程中构建[Char]

解决方法

您可以使用scan

scan :: s -> (s -> Word8 -> Maybe s) -> Parser ByteString

状态扫描器。谓词使用并转换状态参数,然后将每个转换后的状态传递给输入的每个字节上谓词的连续调用,直到返回Nothing或输入结束。

它看起来像这样:

transitions :: [((Int,Char),Int)]
transitions = [((0,'-'),1),((1,2),((2,'>'),3)]

dfa :: Int -> Word8 -> Maybe Int
dfa 3 w = Nothing
dfa s w = lookup (s,toEnum (fromEnum w)) transitions <|> Just 0

然后使用scan 0 dfa提取直到最后一个"-->"为止的字节。我在这里使用的状态告诉我们到目前为止已经看到了"-->"个字符。看到所有内容后,我们会通知scan该停止了。这仅仅是为了说明这个想法。为了提高效率,您可能想要使用比关联列表更有效的数据结构,将*Enum调用移至查找表,甚至考虑直接编写函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。