问题标签 [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.

0 投票
2 回答
594 浏览

parsing - Attoparsec: skipping up to (but not including) a multi-char delimiter

I have a string that can contain pretty much any character. Inside the string there is the delimiter {{{.

For example: afskjdfakjsdfkjas{{{fasdf.

Using attoparsec, what is the idiomatic way of writing a Parser () that skips all characters before {{{, but without consuming the {{{?

0 投票
1 回答
384 浏览

haskell - Attoparsec 是否支持保存和修改用户状态?

我正在使用 Attoparsec,我想在整个解析任务中跟踪用户状态值。

我熟悉 Parsec 的一元函数 getState、putState 和 modifyState,但我似乎无法在 Attoparsec 中找到类似的函数。有没有一种简单的方法可以通过 Attoparsec 内部的东西或使用 State monad 来做到这一点?

0 投票
1 回答
280 浏览

parsing - 如何使用 attoparsec 解析固定长度、非定界的整数?

我正在尝试使用 attoparsec 从 3 个字符中解析两个整数。示例输入可能如下所示:

...我想解析成:

我有两种可行的解决方案,但有些笨拙:

必须有更好的方法来实现如此简单的事情。我错过了什么吗?

0 投票
1 回答
168 浏览

haskell - attoparsec:在部分输入上成功而不是失败

我有一个attoparsec解析器,并对其进行测试,令我烦恼的是,如果我评论解析器的一部分并运行测试,解析器不会返回Left "parse error at line ...",而是我得到Right [].

请注意,我parseOnly用来明确表示不会再有任何输入。

否则很高兴获得部分解析的输入,它肯定很有用,我很高兴拥有它。但是我想被告知整个输入没有被消耗。也许是为了获得最后一个使用的字母的字符偏移量,或者如果这就是它所需要的,至少是一个要返回的选项Left

如果它是相关的,解析器可以在那里找到。

例如,如果我评论以下行:

并运行测试,例如:

这是来自那个测试

0 投票
1 回答
985 浏览

haskell - attoparsec:“嵌套”解析器——使用不同的解析器解析输入的子集

好吧,事实上我很确定我使用了错误的术语。这是我要解决的问题:markdown格式的解析器,以及它的子集。

我的问题是块引用功能。块引用中的每一行都以>;开头 否则一切都是降价文件中的正常结构。

您不能单独查看各个行,因为您需要将段落与普通行分开,例如

不一样

和类似的事情(如果一个列表被块引用,你不想要 x 列表而是一个带有 x 元素的列表)。一种自然而简单的方法是“取消”>符号,自行解析块引用,忽略它周围的任何内容,用类型构造函数包装它,将其BlockQuote放入外部 AST 并继续解析原始输入。pango如果我没记错,这就是:

https://hackage.haskell.org/package/pandoc-1.14.0.4/docs/src/Text-Pandoc-Readers-Markdown.html#blockQuote

接着:

http://hackage.haskell.org/package/pandoc-1.5.1/docs/src/Text-Pandoc-Shared.html#parseFromString

现在parseFromString对我来说看起来很hacky,除此之外它Parsec也不attoparsec是所以我不能在我的项目中使用它。我不确定如何Text从块引用中获取并解析它并返回解析结果,以便它“适合”当前解析。似乎不可能?

我一直在谷歌上搜索这个问题,我认为并且可以在该领域提供帮助pipes-parseconduit尽管我很难找到示例,而且我看到的东西看起来比“纯”解析器/attoparsec解析器要好得多。

解析块引用的其他选项是重写通常的解析器,但需要注意的是>……复杂化和重复很多。解析块引用分别计算每一行并编写一些凌乱的“合并”函数。或者解析到第一个 AST,它将包含块引用作为Text在第一个BlockquoteText类型构造函数中等待转换,在那里它们将被单独解析,不是很优雅,但它具有简单的好处,这确实很重要。

我可能会选择后者,但肯定有更好的方法吗?

0 投票
1 回答
185 浏览

haskell - 如何编写更通用(但更高效)的 attoparsec 的 takeWhile1 版本?

Data.Attoparsec.Text出口takeWhiletakeWhile1

只要谓词返回True,就消费输入,并返回消费的输入。

此解析器不会失败。False如果谓词在输入的第一个字符上返回,它将返回一个空字符串。

[...]

只要谓词返回True,就消费输入,并返回消费的输入。

此解析器要求谓词在至少一个输入字符上成功:如果谓词永远不会返回True或没有输入,它将失败。

attoparsec的文档鼓励用户

Text尽可能使用面向- 的解析器,例如,takeWhile1而不是many1 anyChar. 两种解析器之间的性能差异大约为 100 倍。

这两个解析器非常有用,但我一直觉得需要一个更通用的版本takeWhile1,更具体地说,一些假设的解析器

这将至少 解析lo满足 predicate 的字符f,其中lo是任意非负整数。

我查看了takeWhile1的实现,但它使用了一堆私有的函数,Data.Attoparsec.Text.Internal并且似乎不容易推广。

我想出了以下应用实现:

它像宣传的那样工作,

但是需要打包返回的结果的中间列表count让我担心,特别是对于lo很大的情况......这似乎与建议背道而驰

Text尽可能使用面向- 的解析器 [...]

我错过了什么吗?有没有更有效/惯用的方式来实现这样的takeWhileLo组合器?

0 投票
1 回答
142 浏览

haskell - attoparsec 如何返回不同类型的值?

我被 attoparsec 困住了,我无法返回关于它的“嵌入式类型”的值。

我尝试解析一种文件:

例如:

我当前的数据类型是:

我的解析器看起来像:

但 GHC 抱怨说:

我明白为什么,但不知道如何解决这个问题!

目前,我使用ExistantialQuantificationpragma with Data.Typeable,但我不确定解决方案是否需要“如此复杂”来解决这个问题?

0 投票
2 回答
239 浏览

performance - 有效地将大文件读入地图

我正在尝试编写代码以在 Haskell 中执行以下简单任务:使用该字典查找单词的词源,存储为一个大的 tsv 文件(http://www1.icsi.berkeley.edu/~demelo/etymwn/)。我想我会(使用 attoparsec)将 tsv 文件解析为一个 Map,然后我可以根据需要使用它来有效地查找词源(并做一些其他的事情)。

这是我的代码:

它适用于少量输入,但很快就会变得太低效。我不太清楚问题出在哪里,并且很快意识到,即使是像查看文件的最后一个字符这样的琐碎任务,在我尝试时也会花费太长时间,例如

所以我的问题是:在方法和执行方面,我做错的主要事情是什么?有关更多 Haskelly/更好代码的任何提示?

谢谢,

鲁本

0 投票
2 回答
336 浏览

haskell - 为什么当行尾序列是 CRLF 时,这个解析器总是失败?

这个简单的解析器预计会解析表单的消息

一个 EOL 充当字段分隔符,双 EOL 充当消息分隔符。当 EOL 分隔符为时它工作得非常好,\n但当parseWith它是时总是返回失败\r\n

0 投票
3 回答
298 浏览

parsing - 使用 attoparsec 对解析后的数据进行操作

背景

我已经使用 attoparsec 编写了一个日志文件解析器。我所有的小型解析器都成功了,组合的最终解析器也是如此。我已经通过测试证实了这一点。但是我在使用解析后的流执行操作时遇到了麻烦。

我试过的

我首先尝试将成功解析的输入传递给函数。但似乎得到的只是Done (),我假设这意味着日志文件已经被消耗掉了。

我正在尝试做的事情

我想在使用输入时从日志文件中积累一些统计信息。例如,我正在解析响应代码,我想计算有多少 2** 响应和多少 4/5** 响应。我正在解析作为 Ints 返回的每个响应的字节数,并且我想有效地将​​这些相加(听起来像foldl'?)。我已经定义了这样的数据类型:

我想在解析输入时不断更新它。但是在我消费时执行操作的部分是我卡住的地方。到目前为止print,这是我成功将输出传递给的唯一函数,它通过Done在打印输出之前返回来显示解析成功。

我的主要解析器如下所示:

期望的结果

我想将每个解析的行传递给将更新上述数据类型的函数。理想情况下,我希望这非常节省内存,因为它将在大文件上运行。