问题标签 [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 - 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 {{{
?
haskell - Attoparsec 是否支持保存和修改用户状态?
我正在使用 Attoparsec,我想在整个解析任务中跟踪用户状态值。
我熟悉 Parsec 的一元函数 getState、putState 和 modifyState,但我似乎无法在 Attoparsec 中找到类似的函数。有没有一种简单的方法可以通过 Attoparsec 内部的东西或使用 State monad 来做到这一点?
parsing - 如何使用 attoparsec 解析固定长度、非定界的整数?
我正在尝试使用 attoparsec 从 3 个字符中解析两个整数。示例输入可能如下所示:
...我想解析成:
我有两种可行的解决方案,但有些笨拙:
必须有更好的方法来实现如此简单的事情。我错过了什么吗?
haskell - attoparsec:“嵌套”解析器——使用不同的解析器解析输入的子集
好吧,事实上我很确定我使用了错误的术语。这是我要解决的问题:markdown
格式的解析器,以及它的子集。
我的问题是块引用功能。块引用中的每一行都以>
;开头 否则一切都是降价文件中的正常结构。
您不能单独查看各个行,因为您需要将段落与普通行分开,例如
不一样
和类似的事情(如果一个列表被块引用,你不想要 x 列表而是一个带有 x 元素的列表)。一种自然而简单的方法是“取消”>
符号,自行解析块引用,忽略它周围的任何内容,用类型构造函数包装它,将其BlockQuote
放入外部 AST 并继续解析原始输入。pango
如果我没记错,这就是:
接着:
http://hackage.haskell.org/package/pandoc-1.5.1/docs/src/Text-Pandoc-Shared.html#parseFromString
现在parseFromString
对我来说看起来很hacky,除此之外它Parsec
也不attoparsec
是所以我不能在我的项目中使用它。我不确定如何Text
从块引用中获取并解析它并返回解析结果,以便它“适合”当前解析。似乎不可能?
我一直在谷歌上搜索这个问题,我认为并且可以在该领域提供帮助pipes-parse
,conduit
尽管我很难找到示例,而且我看到的东西看起来比“纯”解析器/attoparsec解析器要好得多。
解析块引用的其他选项是重写通常的解析器,但需要注意的是>
……复杂化和重复很多。解析块引用分别计算每一行并编写一些凌乱的“合并”函数。或者解析到第一个 AST,它将包含块引用作为Text
在第一个BlockquoteText
类型构造函数中等待转换,在那里它们将被单独解析,不是很优雅,但它具有简单的好处,这确实很重要。
我可能会选择后者,但肯定有更好的方法吗?
haskell - 如何编写更通用(但更高效)的 attoparsec 的 takeWhile1 版本?
Data.Attoparsec.Text
出口takeWhile
和takeWhile1
:
只要谓词返回
True
,就消费输入,并返回消费的输入。此解析器不会失败。
False
如果谓词在输入的第一个字符上返回,它将返回一个空字符串。[...]
只要谓词返回
True
,就消费输入,并返回消费的输入。此解析器要求谓词在至少一个输入字符上成功:如果谓词永远不会返回
True
或没有输入,它将失败。
attoparsec
的文档鼓励用户
Text
尽可能使用面向- 的解析器,例如,takeWhile1
而不是many1 anyChar
. 两种解析器之间的性能差异大约为 100 倍。
这两个解析器非常有用,但我一直觉得需要一个更通用的版本takeWhile1
,更具体地说,一些假设的解析器
这将至少 解析lo
满足 predicate 的字符f
,其中lo
是任意非负整数。
我查看了takeWhile1
的实现,但它使用了一堆私有的函数,Data.Attoparsec.Text.Internal
并且似乎不容易推广。
我想出了以下应用实现:
它像宣传的那样工作,
但是需要打包返回的结果的中间列表count
让我担心,特别是对于lo
很大的情况......这似乎与建议背道而驰
Text
尽可能使用面向- 的解析器 [...]
我错过了什么吗?有没有更有效/惯用的方式来实现这样的takeWhileLo
组合器?
haskell - attoparsec 如何返回不同类型的值?
我被 attoparsec 困住了,我无法返回关于它的“嵌入式类型”的值。
我尝试解析一种文件:
例如:
我当前的数据类型是:
我的解析器看起来像:
但 GHC 抱怨说:
我明白为什么,但不知道如何解决这个问题!
目前,我使用ExistantialQuantification
pragma with Data.Typeable
,但我不确定解决方案是否需要“如此复杂”来解决这个问题?
performance - 有效地将大文件读入地图
我正在尝试编写代码以在 Haskell 中执行以下简单任务:使用该字典查找单词的词源,存储为一个大的 tsv 文件(http://www1.icsi.berkeley.edu/~demelo/etymwn/)。我想我会(使用 attoparsec)将 tsv 文件解析为一个 Map,然后我可以根据需要使用它来有效地查找词源(并做一些其他的事情)。
这是我的代码:
它适用于少量输入,但很快就会变得太低效。我不太清楚问题出在哪里,并且很快意识到,即使是像查看文件的最后一个字符这样的琐碎任务,在我尝试时也会花费太长时间,例如
所以我的问题是:在方法和执行方面,我做错的主要事情是什么?有关更多 Haskelly/更好代码的任何提示?
谢谢,
鲁本
haskell - 为什么当行尾序列是 CRLF 时,这个解析器总是失败?
这个简单的解析器预计会解析表单的消息
一个 EOL 充当字段分隔符,双 EOL 充当消息分隔符。当 EOL 分隔符为时它工作得非常好,\n
但当parseWith
它是时总是返回失败\r\n
。
parsing - 使用 attoparsec 对解析后的数据进行操作
背景
我已经使用 attoparsec 编写了一个日志文件解析器。我所有的小型解析器都成功了,组合的最终解析器也是如此。我已经通过测试证实了这一点。但是我在使用解析后的流执行操作时遇到了麻烦。
我试过的
我首先尝试将成功解析的输入传递给函数。但似乎得到的只是Done ()
,我假设这意味着日志文件已经被消耗掉了。
我正在尝试做的事情
我想在使用输入时从日志文件中积累一些统计信息。例如,我正在解析响应代码,我想计算有多少 2** 响应和多少 4/5** 响应。我正在解析作为 Ints 返回的每个响应的字节数,并且我想有效地将这些相加(听起来像foldl'
?)。我已经定义了这样的数据类型:
我想在解析输入时不断更新它。但是在我消费时执行操作的部分是我卡住的地方。到目前为止print
,这是我成功将输出传递给的唯一函数,它通过Done
在打印输出之前返回来显示解析成功。
我的主要解析器如下所示:
期望的结果
我想将每个解析的行传递给将更新上述数据类型的函数。理想情况下,我希望这非常节省内存,因为它将在大文件上运行。