问题标签 [attoparsec]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 使用 Attoparsec 时输入不完整的问题
我正在转换一些使用 Parsec 的功能性 Haskell 代码,而不是使用 Attoparsec,以期获得更好的性能。我进行了更改,一切都编译了,但我的解析器无法正常工作。
我正在解析一个包含各种记录类型的文件,每行一个。我用于解析记录或注释的每个单独的函数都可以正常工作,但是当我尝试编写一个函数来编译一系列记录时,解析器总是返回部分结果,因为它需要更多的输入。
这是我尝试过的两个主要变体。两者都有同样的问题。
对于第二个,我更改了记录/注释解析器以使用行尾字符。
我的方法有什么问题吗?还有其他方法可以实现我的尝试吗?
parsing - 理解 attoparsec
有人建议我使用 attoparsec 来解析文件,现在我必须了解如何使用它;有人给了我这段代码:
#
效果很好,但我不知道为什么:使用翻转的原因是什么,将A.feed的参数放在不同的顺序中不是更容易吗?为什么有B.empty?有一些我可以学习的教程吗?提前致谢
parsing - Haskell:当输入字符串为空时如何停止 Data.Attoparsec.Char8.sepBy?
我写了以下 Haskell 代码
该代码假设以这种方式工作:
但由于我在上面编写的代码中定义了 someWithSep ,所以我总是得到以下行为:
除非我提供损坏的条目:
我该如何纠正这个?
感谢回复
parsing - Attoparsec 在大型“接受”调用中分配大量内存
所以我正在编写一个数据包嗅探应用程序。基本上我希望它嗅探 tcp 会话,然后解析它们以查看它们是否是 http,如果它们是,以及它们是否具有正确的内容类型等,将它们作为文件保存在我的硬盘上。
因此,为此,我希望它高效。由于当前的 http 库是基于字符串的,而且我将处理大文件,而且我真的只需要解析 http 响应,因此我决定在 attoparsec 中推出我自己的库。
当我完成我的程序时,我发现当我解析一个包含 wav 文件的 9 meg http 响应时,当我分析它时,它在尝试解析 http 响应的主体时分配了一个内存. 当我查看 HTTP.prof 时,我看到了一些行:
如您所见,在 httpbody 中的某处,take 被调用了 1201 次,导致 500+ (+++) 个字节串连接,这导致了荒谬的内存分配量。
这是代码。N 只是 http 响应的内容长度,如果有的话。如果没有,它只是试图夺走一切。
我希望它返回一个包含 1000 个左右字符字节串的惰性字节串,但即使我将它更改为只取 n 并返回一个严格的字节串,它仍然有这些分配(并且它使用 14 gig 的内存)。
我正在阅读一个做组合的人的博客,他遇到了同样的问题,但我从未听说过解决方案。有没有人遇到过这个问题或找到解决方案?
编辑:好的,好吧,我一整天都把它放在一边,什么也没得到。在研究了这个问题之后,我认为没有办法在不向 attoparsec 添加惰性字节串访问器的情况下做到这一点。我还查看了所有其他库,它们要么缺少字节串,要么缺少其他东西。
所以我找到了一个解决方法。如果您考虑一个 http 请求,它会出现标题、换行符、换行符、正文。由于主体是最后一个,并且解析返回一个元组,其中包含您解析的内容和剩余的字节串,我可以跳过在 attoparsec 中解析主体,而是直接从剩下的字节串中提取主体。
它有点乱,但最终它运行得很快,并且只分配了我想要的。所以基本上你折叠收集http数据结构的字节串,然后在集合之间,我检查我刚刚得到的结构的内容长度,从剩余的字节串中提取适当的数量,然后如果还有任何字节串就继续。
编辑:我实际上完成了这个项目。奇迹般有效。我没有正确地阴谋化,但如果有人想查看整个源,你可以在https://github.com/onmach/Audio-Sniffer找到它。
haskell - 使用 attoparsec 解析 JPEG 标记
作为一个提高我对 Haskell 知识和舒适度的项目,我正在努力实现一个 JPEG 解码器,它将在未来的计算机视觉工作中派上用场。
我选择的第一步是解析图像中的所有“标记”。这些由字节 0xFF 后跟非 0 字节指示。0xFF 字节后跟 0x00 字节应被视为正常数据。
我遇到的问题是,在遇到 0xFF 0x00 组合时,解析似乎完全完成并且没有找到更多有效标记(如果您在标准 JPEG 上运行,您将看到解析图像标记的开头,但不是结尾图像标记通常 0xFF 0x00 出现在图像数据本身内)。
haskell - Attoparsec Iteratee
我想,只是为了了解一些关于 Iteratees 的知识,使用 Data.Iteratee 和 Data.Attoparsec.Iteratee 重新实现我制作的一个简单的解析器。不过,我很难过。下面我有一个简单的例子,它能够解析文件中的一行。我的解析器一次读取一行,所以我需要一种向迭代器提供行的方法,直到它完成。我已经阅读了我在谷歌上搜索到的所有内容,但是很多关于 iteratee/enumerators 的材料都非常先进。这是重要的代码部分:
此示例将解析并打印多行文件中的一行。原始脚本将解析器映射到 ByteStrings 列表。所以我想在这里做同样的事情。我enumLines
在 Iteratee 中找到了,但我终生无法弄清楚如何使用它。也许我误解了它的目的?
parsing - 使 attoparsec 解析器递归
我一直在编写一个 attoparsec 解析器,并且一直在遇到一种模式,我想将解析器转换为递归解析器(将它们与 monad bind >>= 运算符递归组合)。
所以我创建了一个函数来将解析器转换为递归解析器,如下所示:
如果您有递归数据类型,这很有用
有没有更惯用的解决方案?似乎recursiveParser
应该是某种折叠......我也在sepBy
文档中看到,但这种方法似乎更适合我的应用程序。
编辑:哦,实际上现在我想它实际上应该类似于fix
......不知道我是怎么忘记的。
EDIT2: Rotsor 在我的例子中用他的替代方案提出了一个很好的观点,但我担心我的 AST 实际上比这更复杂一些。它实际上看起来更像这样(尽管这仍然是简化的)
其中字符串a -> b
括号在右侧,c:d
括号在左侧,:
绑定比->
.
即a -> b
评估为
并c:d
评估为
我想我可以使用foldl
一个和foldr
另一个,但那里仍然有更多的复杂性。请注意,它以一种有点奇怪的方式递归,因此"a:b:c -> e:f -> :g:h ->"
实际上是一个有效的字符串,但"-> a"
不是"b:"
。最后fix
对我来说似乎更简单。我已经像这样重命名了递归方法:
谢谢。
haskell - 使用 map 和 ByteString 键对折叠的性能分析
我有一个小脚本可以从 apache 日志文件中读取、解析和导出某种有趣的(不是真的)统计信息。到目前为止,我已经做了两个简单的选择,日志文件中所有请求中发送的字节总数,以及最常见的 10 个 IP 地址。
第一个“模式”只是所有已解析字节的简单总和。第二个是地图上的折叠(Data.Map),insertWith (+) 1'
用于计算出现次数。
第一个按照我的预期运行,大部分时间都花在解析上,在恒定空间中。
42,359,709,344 字节分配在堆中 72,405,840 字节在 GC 期间复制 113,712 字节最大驻留(1553 个样本) 145,872 字节最大斜率 2 MB 正在使用的总内存(0 MB 由于碎片而丢失)
第 0 代:76311 次收集,
0 次并行,0.89 秒,0.99 秒过去
第 1 代:1553 次收集,0 次并行,0.21 秒,0.22 秒过去INIT 时间 0.00s(经过 0.00s) MUT 时间 21.76s(经过 24.82s) GC 时间 1.10s(经过 1.20s) EXIT 时间
0.00s(经过 0.00s) 总时间 22.87s(经过 26.02s)%GC 时间 4.8%(经过 4.6%)
分配速率 1,946,258,962 字节/MUT 秒
生产力占总用户的 95.2%,占总使用时间的 83.6%
但是,第二个没有!
49,398,834,152 字节分配在堆中 580,579,208 字节在 GC 期间复制 718,385,088 字节最大驻留(15 个样本) 134,532,128 字节最大斜率 1393 MB 正在使用的总内存(172 MB 由于碎片而丢失)
第 0 代:91275 次收集,
0 次并行,252.65 秒,254.46 秒经过
第 1 代:15 次收集,0 次并行,0.12 秒,0.12 秒经过INIT 时间 0.00s(经过 0.00s) MUT 时间 41.11s(经过 48.87s) GC 时间 252.77s(经过 254.58s) EXIT 时间
0.00s(经过 0.01s) 总时间 293.88s(经过 303.45s)%GC 时间 86.0%(经过 83.9%)
分配速率 1,201,635,385 字节/MUT 秒
生产力占总用户的 14.0%,占总使用时间的 13.5%
这是代码。
编辑:
添加 +RTS -A16M 将 GC 降低到 20%。内存使用当然不变。
haskell - Attoparsec 中的条件解析和强制转换
我正在解析一个长度编码的二进制流,并且正在尝试编译此代码。combinatorrent 代码(https://github.com/jlouis/combinatorrent/blob/master/src/Protocol/Wire.hs)对让我继续前进非常有帮助,但现在我被卡住了。如何在 return 语句中使用 frame_length?
另外:我如何使用 pass (AP.take 8) 进入 Word64?
haskell - 等价于 Parsec 中的 attoparsecs `inClass`
我正在将一些代码从 attoparsec 转换为 Parsec,因为解析器需要产生更好的错误消息。attoparsec 代码广泛使用inClass
(and notInClass
)。Parsec 是否有类似的功能可以让我inClass
机械地翻译 -occurrences?Hayoo 和 Hoogle 没有就此事提供任何见解。
inClass "a-c'-)0-3-"
等价于\ x -> elem x "abc'()0123-"
,但后者对于大范围的编写效率低下且繁琐。
如果没有其他可用的,我将自己重新实现该功能。