问题标签 [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.
parsing - 如何有效地解析熵编码的 JPEG 块?
我只是想跳过 .JPEG 文件中的 SOS_MT 块,我不想将数据用于任何事情,我只想知道它在哪里结束。根据我从 Wikipedia 中 JPEG 的文章中了解到的内容,虽然 JPEG 文件中的所有其他块都以指示块长度的几个字节开头,但 SOS_MT 块是......好吧,一个邪恶的沼泽,你别无选择,只能解析一个字节一个字节,直到你读完为止。
所以我提供了以下代码来做到这一点:
此代码使用Atoparsec,据我有机会验证它是正确的。只是很慢。关于如何在性能方面改进此解析器的任何提示?
haskell - 管道:产生内存泄漏
在对上一个问题(haskell-data-hashset-from-unordered-container-performance-for-large-sets)进行一些观察时,我偶然发现了一个奇怪的内存泄漏
这是一些示例输出:
现在我的问题是:
- 为什么
m1
不生产[1,2,3,4]
? - 为什么会
m2
失败? - 为什么
m4
与所有其他版本相比行为完全不同并产生空间泄漏?
haskell - Attoparsec:从 Data.Word 和 Data.Int 解析数据类型的更简单方法?
我目前正在游戏网络代码中恭敬地使用bytestring
和进行序列化和反序列化。attoparsec
我最初被这些库所吸引,cereal
因为它对bytestring
Builders 提供了非常细粒度的控制,包括有用的分配策略和低级primatives 。我认为这将是一个不错的选择,因为它可以确保我能够更好地处理我在项目后期可能遇到的任何延迟/GC 问题。
虽然bytestring
提供了许多常见数据类型的组合子,但在数据包字段中会遇到的常见数据类型(主要是在Data.Word
和、和Data.Int
中找到的类型),但当我在. 我错过了什么吗?我可以用提供的组合器模拟一些等效的东西吗?Word16
Word16
Int8
attoparsec
如果是缺少功能的情况,添加此功能的通常方法是什么?我当然不是第一个需要用图书馆解码签名短裤的人。这个功能不存在有什么原因吗?是否有一个我应该补充attoparsec
的我不知道的通用库?或者我应该做这样的事情:
因为这是在内部做的事情cereal
,binary
也是我目前为获得此功能所做的事情,但最好不必使用临时的不安全函数来执行他们bytestring
的APIcereal
中binary
已经提供的内容.
当大多数人需要在低延迟网络环境中处理Int64
, Int32
, Int16
, Int8
, Word64
, Word32
, 和attoparsec 时,他们会怎么做?Word16
(NEWBIE NOTE)这里有一个可能很幼稚的假设。我隐含地假设cereal
处理网络数据包的速度并不比 和 中的实现bytestring
快attoparsec
。这个假设起源于观看有关 binary-serialise-cbor 的一些谈话,这些谈话指出相当大量的分配发生在cereal
和binary
由于他们在缓冲区中编码和解码二进制数据的延续方法。我正在处理网络数据包,这些数据包通常可以以一种非常简单和无状态的方式进行编码和解码,其中偶尔出现的字段的编码/解码子例程取决于先前看到的字段的值。也许我需要在这里进行现实检查并且我使用了错误的工具来完成这项工作?也许在这个高层次上我真的没有什么可以做的来改善我的处境?假设“不要过早优化”在这种情况下不适用。
haskell - attoparsec 中的条件前瞻
假设有一个数据结构表示内部带有注释的文本。
因此像字符串一样
可以编码为
注释块和 forE
的解析器非常简单:
以如此简单的方式实现文本块的解析器
由于其贪婪的性质,使其将评论部分作为文本使用
那么,问题是如何表达直到输入结束或直到评论部分的解析逻辑?换句话说,如何实现条件前瞻解析器?
haskell - 将 attoparsec 解析器转换为解析器,如果它消耗的字节数不是特定长度,则该解析器将失败
假设我有一个 attoparsec 解析器,x
.
我正在寻找创建一个函数f :: Int -> Parser a -> Parser a
,例如 if y = f n x
,然后:
y
如果失败则x
失败y
如果x
成功则失败并且x
不消耗n
字节y
否则成功
我该怎么做呢?
haskell - 如何制作返回向量而不是列表的自定义 Attoparsec 解析器组合器?
上面只是一个例子,但是我需要在 Haskell 中解析大量的原始值,并且需要使用数组而不是列表。这在F# 的 Fparsec中是可能的,所以我已经研究了 Attoparsec 的源代码,但我想不出办法。事实上,我无法弄清楚Haskell 库中many
从哪里Control.Applicative
定义的。base
我认为它会在那里,因为那是关于 Hackage 的文档指向的地方,但没有这样的运气。
另外,我在决定在这里使用什么数据结构时遇到了麻烦,因为我在 Haskell 中找不到像可调整大小的数组那样方便的东西,但我宁愿不使用效率低下的基于树的结构。
我的一个选择是跳过 Attoparsec 并在 ST monad 中实现整个解析器,但我宁愿避免它,除非作为最后的手段。
haskell - 解析第一次出现的单词前面没有空格
环境
我需要在某个没有空格的 .txt 文件中找到第一次出现的单词。以下是可能的情况:
现在 t6 正在成功,即使它应该失败,因为我的解析器会消耗任何字符,直到它到达 hello。这是我的解析器:
我的解决方案
haskell - 解析器:在顺序未知时强制执行唯一性
使用 Attoparsec,我试图匹配包含 1 个“x”、1 个“y”和 1 个“z”以及任意数量的“a”、“b”或“c”的字符串,对顺序没有任何限制每个字符。
例如,“abbb z ac y aaa x cba”和“abbb z ac x aaa y cba”应该匹配,但以下不应该:
- “abbb z ac y aaacba”(原因:没有“x”)
- “abbb z ac y aaa x cb x a”(原因:重复的“x”)
到目前为止,我能做的最好的是:
(随意地,我选择用'\n'停止解析,但这只是举一个简单的例子)。
然后在 ghci 中尝试:
但它看起来很笨重,而且它不容易扩展到唯一字符列表(例如,我得到了一个没有重复的 givenchars :: [Char] 列表,我想匹配由所有 givenchars 和任何 'a 组成的任何字符串','b','c 介于两者之间,顺序不限)。
有没有更好、更优雅、更可扩展的方法来做到这一点?
PS:我不是在寻找正则表达式解决方案,因为它不适用于我的现实问题。我需要使用解析器。
parsing - 有没有办法强制 attoparsec 不回溯?
我已经使用Attoparsec编写了一些解析器,但直到现在才意识到我并不总是希望它们在失败时回溯,但 attoparsec 解析器总是在失败时回溯。
有没有办法强制解析器不回溯?
例如,当给定输入“for”时,此 attoparsec 解析器将成功:
解析器解析器在该输入上不会成功,我想使用 attoparsec 解析器来模拟这种行为。
haskell - 简单的解析器内存不足
我想了解为什么这个简单的解析器会耗尽大文件的内存。我真的不知道我在做什么错。
我正在运行程序:
输出:
x.log 的大小约为 500MB。我的机器有 16GB 的 RAM。