问题标签 [parsec]

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 回答
120 浏览

parsing - 在解析期间对不同类型的术语进行分区

我有两个用于不同类型术语的解析器。

我有一个表示这些术语序列的数据类型。

如果我的输入是一系列混合术语,那么将s 与sc :: Parser C分开并保留它们的顺序的好方法是什么?例如,给定这些定义:AB

"abAbBBA"将解析为序列aAAbbBB. 我有一种需要使用的感觉StateT,但不确定具体细节,只需要朝着正确的方向推进。

0 投票
1 回答
229 浏览

haskell - 解析器跳过行

我想为Jade的一个子集编写一个简单的解析器,生成一些XmlHtml以供进一步处理。

解析器非常简单,但与Parsec一样,有点长。因为我不知道是否允许我发布这么长的代码帖子,所以我在这里有完整的工作示例。

我以前涉足过 Parsec,但很少成功。现在,我不太明白为什么它似乎吞下了以下几行。例如,jade 的输入

用 测试parseTest tag txt,返回:

我的解析器似乎能够处理任何类型的嵌套,但绝不会超过一行。我错过了什么?

0 投票
2 回答
783 浏览

parsing - 秒差距位置作为偏移量

使用 Parsec 可以轻松地将位置作为偏移量(作为输入开始的字符)吗?如果是这样,怎么做?Parsec 在内部将位置保留为具有源名称、行和列的数据类型。

我希望能够编写一个解析器

它使用解析器 p 解析某些东西,并返回它的结果,以及它的左右位置作为offsets

alex(词法分析器生成器)例如处理保持绝对字符偏移、行号和列号的位置。我错过了秒差距的绝对字符偏移量。

0 投票
1 回答
1134 浏览

haskell - 不支持 Parsec.Expr 重复前缀/后缀运算符

的文档Parsec.Expr.buildExpressionParser说:

相同优先级的前缀和后缀运算符只能出现一次(即,如果- 是前缀否定,则--2 是不允许的)。

确实,这让我很痛苦,因为我试图解析的语言允许任意重复其前缀和后缀运算符(想想像这样的 C 表达式**a[1][2])。

那么,为什么要Parsec做出这个限制,我该如何解决呢?

我想我可以将我的前缀/后缀解析器向下移动到term解析器中,因为它们具有最高优先级。

IE

被解析为

但是如果我想让它解析为

如果buildExpressionParser做了我想要的,我可以简单地重新排列表中运算符的顺序。

注意请参阅此处以获得更好的解决方案

0 投票
1 回答
278 浏览

haskell - Parsec 的类型错误

我正在使用 Parsec 3.1.2 和 GHC 7.4.1 来尝试为有点毛茸茸的数据文件格式编写解析器。我认为这是一个非常微不足道的案例,但我遇到了类型错误。我正在尝试遵循 Real World Haskell 中的应用函子示例。

现在,最初我收到以下类型错误:

基于Trivial parsec example 产生类型错误我尝试添加NoMonomorphismRestriction语言 pragma,但这没有帮助。

我承认,我发现 Parsec 的学习曲线相当陡峭,尽管我有一点 Haskell 经验。Real World Haskell 书中的示例基于 Parsec 2 并没有帮助。

0 投票
3 回答
1759 浏览

haskell - 如何让 Parsec 让我调用`read` :: Int?

我有以下,类型检查:

现在,正如函数名所暗示的,我希望它给我一个 Int。但如果我这样做:

我收到这种类型的错误:

有没有一种更简单、更简洁的方法来解析可能有空格的整数?或者有办法解决这个问题?

最终,我希望这成为以下内容的一部分:

这是解析如下所示的行:

所以我最终可以调用一个需要这些值的 BetaPair 构造函数(一些作为 Int,一些作为其他类型,如 [Exposure] 和 Parallel)

(如果你好奇,这是一个文件格式的解析器,它代表蛋白质中的氢键 β 链对等。我无法控制文件格式!)

0 投票
1 回答
697 浏览

haskell - 秒差类型的问题

在为特定的计算生物学文件格式编写解析器时,我遇到了一些麻烦。

这是我的代码:

现在,如果我注释掉 betaLine 的定义,一切都会编译,并且我已经成功测试了单独的解析器 p_int、p_direction 和 p_exposure。

但是,当存在 betaLine 方程时,我会收到一个我不太理解的类型错误。我对应用程序 <*> 的理解是错误的吗?最终,我希望它返回 Int -> Int -> Int -> Int -> Direction -> ExposureList,然后我可以将其提供给 BetaPair 的构造函数。

类型错误是:

0 投票
1 回答
1261 浏览

haskell - 行尾的 Parsec 问题

我有一个 Parsec 解析器,我主要以应用风格编写。在一种情况下(我唯一一次使用sepBy)我的eol解析器有问题。首先,几个定义:

注意:betaLine完美运行(为简洁起见,我省略了p_int等的定义:

这个其他解析器会出现问题,hmmMatchEmissions

现在,如果我<* eol从解析器定义中删除,并\n从行中删除,它确实有效:

那么,为什么在但不是eol的情况下工作?betaLinehmmMatchEmissions

我会注意到这是我唯一使用的地方sepBy;这可能是一个线索吗?

更新:我做了以下事情,现在失败了:/

这是失败的:

我会注意到第010 列中的意外是0.124令牌的第一个字符。

0 投票
2 回答
873 浏览

haskell - Parsec 超前处理整数

我正在使用 Parsec 解析器来处理有点复杂的数据文件格式(我无法控制这种格式)。

我已经取得了很大的进步,但目前我坚持以下几点。

我需要能够像这样解析一行:

语义上,4是一个nodeNum,Floats*是负对数概率(因此,*表示概率为零的负对数)。和149减号真的很垃圾,我可以丢弃,但我至少需要确保它们不会破坏解析器。

这是我到目前为止所拥有的:

这处理了我提到的“垃圾”。它可能更简单,但它本身就可以工作。

nodeNum行的开头由另一个有效的解析器处理,我不需要进入。

问题在于尝试p_logProb从行中挑选出所有 s ,而不消耗 . 开头的数字emAnnotationSet

解析器p_logProb看起来像这样:

最后,我尝试将logProb条目与尾随emAnnotationSet(以整数开头)分开,如下所示:

因此,p_logProb只会在以数字开头、包含小数点、然后有更多数字的浮点数上成功(文件格式遵守此限制)。

我希望定义try中的 thep_logProb可以避免使用前导数字,如果它不解析小数和其余部分,但这似乎不起作用;Parsec 仍然抱怨它在以下整数的数字之后看到了一个意外的空格emAnnotationSet

第 196 列对应于减号之前的整数之后的空格,所以我很清楚问题在于p_logProb解析器正在使用整数。我该如何解决这个问题,以便p_logProb解析器正确使用前瞻,从而将输入留给emAnnotationSet解析器?

0 投票
1 回答
623 浏览

haskell - Haskell parsec 解析为可能

只是一个我无法解决的简单问题。

我想将字符串解析为 String 或 Maybe Double,其中空字符串或“n/a”被解析为 Nothing。例如:

我在使用 v_nothing(以及引导和训练空白)时遇到问题。

谢谢。

编辑:

我为 v_nothing 尝试了各种各样的事情,但无济于事。