问题标签 [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 回答
519 浏览

haskell - 解析和使用 GADT

我在编写解析器时遇到了问题。具体来说,我想成为不同类型的返回值。例如,我有两种不同的数据类型FAPA代表两种不同的脂质类 -

使用 attoparsec,我构建了解析器来解析脂质速记符号。对于上面的数据类型,我有解析器faParserpaParser. 我希望能够解析 anFAPA. 但是,由于FAPA是不同的数据类型,我不能执行以下操作 -

我最近了解了 GADT,我认为这可以解决我的问题。因此,我制作了一个 GADT 和一个eval函数,并更改了解析器faParserpaParser. -

这让我很接近,但它看起来好像ParsedFA并且ParsedPA是不同的数据类型?例如,解析"PA 17:1_18:1"给了我一个类型的值ParsedLipid PA(不只是ParsedLipid我所期望的)。因此,解析器inputParser仍然不进行类型检查。

关于如何解决这个问题的任何建议?

0 投票
1 回答
122 浏览

performance - attoparsec 高内存使用读取大文件

我尝试了许多方法来逐行解析文件内容,但目前无法正常运行,并且在运行时会占用大量内存(超过 16GB)。

这是我要解析的文件的子集http://lpaste.net/144719

我想要三种错误:

1)回溯错误(多行,第一行就像 3))
2)单行错误,多行
3)单行错误

这是我当前的代码:

第一个问题是解析器没有解析任何东西。第二个问题是使用 16GB 的 RAM。如何改进我的方法?

0 投票
1 回答
281 浏览

haskell - 解析不以 attoparsec 中某些字符结尾的标识符

我一直在编写一个 attoparsec 解析器来解析度量单位的统一代码所称的<ATOM-SYMBOL>. 它被定义为某个类(该类包括所有数字 0-9)中不以数字结尾的最长字符序列。

所以给定我想要消费和返回的输入foo27foo因为237bar26我想要消费和返回237bar,因为19我想失败而不消费任何东西。

我不知道如何用takeWhile1or来构建它takeTillscan但我可能遗漏了一些明显的东西。

更新:到目前为止,我最好的尝试是我设法排除了完全是数字的序列

我尝试更改它以测试最后一个字符是否是数字而不是它们是否都是数字,但它似乎不会一次回溯一个字符。

更新 2:

整个文件位于https://github.com/dmcclean/dimensional-attoparsec/blob/master/src/Numeric/Units/Dimensional/Parsing/Attoparsec.hs。这仅针对来自https://github.com/dmcclean/Dimensionprefixes的分支构建。

0 投票
1 回答
82 浏览

haskell - 使用 Attoparsec 在 Haskell 中读取 POT 文件

我有一组 POT 文件,我想阅读这些文件以便在 Haskell 中对翻译进行后处理。由于 POT 文件非常大,我想使用attoparsec来获得良好的性能。

我尝试使用hgettext,但我的任务不是阅读翻译来翻译我的程序,而只是解析 POT 文件。基本上,我想得到一个(comment, msgid, msgstr)元组列表

0 投票
1 回答
431 浏览

haskell - 具有可能结果的 Attoparsec 可选解析器

我有一个像这样的Attoparsec解析器:

我想让这个解析器成为可选的,所以我得到一个函数,Just txt如果解析器匹配则返回,Nothing否则,即签名函数:

我怎样才能做到这一点?

0 投票
1 回答
121 浏览

haskell - Conduit 和 Attoparsec:解析错误时意外终止

我正在尝试将我写了一段时间的日志文件解析器转换回管道,我遇到了一个问题。我将简化解析器本身的细节,因为这与问题无关。我有一个看起来像这样的日志文件:

所以解析代码非常简单:

到现在为止还挺好。这是我在管道中实现的方法:

运行时main我得到这个输出:

我无法理解为什么管道会在此时终止,而不是像我想做的那样继续解析文件的下一行。阅读文档Data.Conduit.Attoparsec,这似乎正是该用例conduitParserEither的设计目的。

更新

根据@Fabian,事实证明这conduitParserEither并不是我真正想要的。parseEntry这是我想做的定义:

0 投票
2 回答
421 浏览

haskell - 使用 attoparsec 解析 IP 地址

https://www.fpcomplete.com/school/starting-with-haskell/libraries-and-frameworks/text-manipulation/attoparsec给出的解析器似乎可以工作,但它有一个问题。

代码(这里重复)是:

如果解析器输入了一个无效的 IP 地址,例如“1000.1000.1000.1000”,它不会失败,并且由于强制数字转换而返回垃圾结果。

有没有简单的方法来解决这个问题?一种方法是使用较大的Word类型Word32并检查数字是否小于 256。但是,如果输入是病态的(例如溢出Word32),即使这样也可能返回垃圾。转换为Integer似乎是一种选择,因为它是无界的,但同样,对抗性输入可能会使程序耗尽内存。

那么避免这些问题的(希望是优雅的)解析器会是什么样子呢?

0 投票
1 回答
212 浏览

parsing - 如何使用 attoparsec 跳过不需要的文本

我想解析与此类似的电子邮件

但我不需要这封电子邮件中的所有信息。只有“发件人”、“主题”和邮件本身。我怎样才能解析这样的消息?更具体地说,我怎样才能跳过不需要的数据?

这是我到目前为止的代码

0 投票
1 回答
591 浏览

parsing - 快速解析允许转义字符的字符串?

我正在尝试解析一个可以包含转义字符的字符串,这是一个示例:

上面的解析器创建 aString然后将其打包到Text. 有没有办法使用 attoparsec 提供的高效字符串处理函数来解析带有上述转义的字符串?像,,,,,string_ scan_ runScanner_takeWhile...

解析类似的东西"one \"two\" \[three\]"会产生one "two" [three].

更新

感谢@epsilonhalbe,我能够提出一个适合我需求的通用解决方案;请注意,以下函数不会查找匹配的转义字符,例如[..], "..",(..)等;而且,如果它发现一个无效的转义字符,它会将其\视为文字字符。

0 投票
1 回答
178 浏览

haskell - 多行 *non* 与 attoparsec 匹配

我正在玩解析(PostgreSQL)日志,这些日志可以包含多行条目。

所以 - 使用 Perl 或 Python 脚本,我只需抓取下一行,如果它不是以时间戳开头,则将其附加到上一个日志条目。什么是一种明智的方法来解决这个attoparsec问题io-streams?我显然想用lookAhead时间戳做某事但未能匹配时间戳,但我的大脑只是错过了一些东西。


不——还是看不到。我已经剥夺了我所拥有的。解析一行很容易。我不知道如何解析“最多”另一个解析模式 - 我可以看到我可以使用的 lookAhead 函数,但我看不出它如何适合应用“非”条件。

我也看不出我怎么能匹配。完全有可能我的大脑已经卡住了。


编辑:所以,这就是我最终得到的结果,感谢箭头的帮助