问题标签 [fparsec]

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

parsing - fparsec - 组合器“许多”抱怨......为什么不解析这样的块评论?

这个问题,首先,不是我的问题的重复。其实我有3个问题。

在下面的代码中,我尝试创建一个解析器来解析可能嵌套的多行块注释。与引用的其他问题相比,我尝试以直接的方式解决问题,而不使用任何递归函数(请参阅另一篇文章的已接受答案)。

我遇到的第一个问题是 FParsec 的 skipManyTill 解析器也使用流中的结束解析器。所以我创建了skipManyTillEx(Ex for ' exclude endp' ;))。skipManyTillEx 似乎工作 - 至少对于我也添加到 fsx 脚本的一个测试用例。

然而,在显示的代码中,现在我得到“组合器'许多'被应用于一个成功但不消耗......的解析器”错误。我的理论是,commentContent解析器是产生此错误的行。

在这里,我的问题:

  1. 有什么理由,为什么我选择的方法行不通?1中的解决方案,不幸的是,它似乎无法在我的系统上编译,它使用递归低级解析器来处理(嵌套)多行注释。
  2. 任何人都可以看到我实施方式的问题skipManyTillEx吗?我实现的方式和实现的方式有一定的区别skipManyTill,主要是在如何控制解析流程方面。在 originalskipManyTill中,Reply<_>p 和 endp 的 与 一起被跟踪stream.StateTag。在我的实现中,相比之下我没有看到需要使用stream.StateTag,仅依赖Reply<_>状态码。如果解析不成功,skipManyTillEx则回溯到流初始状态并报告错误。回溯代码可能会导致“许多”错误吗?我该怎么做呢?
  3. (这是主要问题) - 有没有人看到,如何修复解析器,这个“很多......”错误消息消失了?

这是代码:

0 投票
1 回答
266 浏览

f# - fparsec 键值解析器解析失败

我必须编写一个解析器来解析文件中的键值对,如下所示:

as235 242kj25klj 对:A=a1|B=b1|C=c1

kjlkjlkjlkj 对:A=a2|B=b2|C=c2

请注意,这些行包含一些垃圾、标签和键值对。

我编写的 F# 代码如下:

预期结果是:

...但是我收到以下错误:

关于如何修复此解析器的任何想法?

谢谢!

更新:在斯蒂芬发表评论后,我试图修复它但没有成功。这是我希望工作的最后一次尝试,但事实并非如此。

现在错误消息是:

0 投票
1 回答
319 浏览

sdp - 如何使用 FParsec 解析成记录或对象?

完成 FParsec 教程后,我决定尝试为 SDP(会话描述协议 RFC 4366)编写解析器——至少前 3 行。SDP 在 ABNF (RFC 4234) 中指定;所以,我正在努力解决这个问题。

用户指南第 5.1 节末尾的注释指出了“您从语法叶节点的简单解析器开始,然后逐步进行,直到最终获得完整语法的解析器”。有了这个方向和斯蒂芬回答使用管道的提示,这就是我现在所拥有的:

这有效(除了 getAddress 不处理 FQDN 或外部地址),结果如下:

现在这是目标记录类型 Sdp。但通过一些元组将结果输入输出是一种有点复杂的方式。

我已经阅读了用户指南到第 5.4 节,但所有示例都解析为有区别的联合。Record类型是整理结果的最佳选择;或者,还有更好的方法?

0 投票
1 回答
75 浏览

f# - 如何在重复模式之后解析正确的时间?

您将如何使用现有的 FParsec 功能在最右边的标记中查找重复的连续模式?

在这种情况下,这是一种合理的可能性。预解析+转义可能有效,但有更好的解决方案吗?我们是否需要编写一个新的前向组合器,如果需要,它是什么样的?

0 投票
1 回答
264 浏览

f# - F#、FParsec 和递归调用流解析器

我正在使用 F# 和 FParsec 开发一个多部分 MIME 解析器。我正在迭代开发,所以这是高度未精炼、脆弱的代码——它只解决了我的第一个直接问题。红色,绿色,重构。

我需要解析一个流而不是一个字符串,这真的让我陷入了循环。鉴于该约束,据我所知,我需要递归调用解析器。如何做到这一点超出了我的理解,至少以我迄今为止的方式进行。

示例 POST 的第一行如下:

content-type: Multipart/related; boundary="RN-Http-Body-Boundary"; type="multipart/related"

它跨越文件中的一行。内容中的其他子部分包括content-type跨越多行的值,所以我知道如果要重用它们,我必须改进我的解析器。

我必须以某种方式调用pContent(字符串?)结果,pBoundary以便我可以在适当的边界上拆分流的其余部分,然后以某种方式返回帖子内容的多个部分,每个部分都是单独的post,带有标题和内容(显然必须是字符串以外的内容)。我的头在旋转。这段代码看起来太复杂了,无法解析一行。

非常感谢洞察力和智慧!

0 投票
1 回答
315 浏览

f# - F#、FParsec 和更新 UserState

好的,由于我的上一个问题没有引起任何回应,我正在朝着不同的方向前进。哈哈!

除了有关管理用户状态或访问先前解析器结果的官方文档之外,我找不到任何示例。

注意 此代码无法编译。

我尝试解析的 POST 的截断示例如下:

0 投票
2 回答
283 浏览

recursion - F#、FParsec 和递归调用流解析器,第二次

感谢您对我的第一篇文章和我关于这个项目的第二篇文章的回复。这个问题与第一个问题基本相同,但我的代码根据收到的关于这两个问题的反馈进行了更新。如何递归调用我的解析器?

我在挠头,茫然地盯着代码。我不知道从这里去哪里。那是我转向stackoverflow的时候。

我在代码注释中包含了我收到的编译时错误。一个绊脚石可能是我受歧视的工会。我与受歧视的工会合作的不多,所以我可能会错误地使用我的工会。

我正在使用的示例 POST(我在前两个问题中包含的部分内容)由一个边界组成,该边界包括具有新边界的第二个帖子。第二个帖子包括由第二个边界分隔的几个附加部分。这几个附加部分中的每一个都是由标题和 XML 组成的新帖子。

我在这个项目中的目标是构建一个在我们的 C# 解决方案中使用的库,该库采用流并将 POST 递归地解析为标题和部分。我真的希望 F# 在这里大放异彩。

编辑

为了回应我迄今为止收到的反馈(谢谢!),我做了以下调整,收到注释的错误:

我尝试加入Reply ()s,但它们只是返回解析器,意思是c上面变成了 aParser<...>而不是Content. 这似乎是一种倒退,或者至少是在错误的方向上。不过我承认我的无知,欢迎指正!

0 投票
1 回答
359 浏览

parsing - 是否可以使用 fparsec 解析“越位”(基于缩进的)语言?

我希望将 FParsec 用于类似 python 的基于缩进的语言。

我知道这必须在词法分析阶段完成,但 FParsec 没有词法分析阶段。是否可以使用 FParsec,或者,如何在词法分析后提供它?

PD:我是 F# 新手,但在其他语言方面经验丰富

0 投票
1 回答
222 浏览

f# - 以乘法的优先级解析“xy z”

我正在尝试使用 FParsec 在 F# 中为 Mathematica 语言编写解析器。

我为 MiniML 编写了一个,它支持f x y = (f(x))(y)函数应用的高优先级语法。现在我需要使用相同的语法来表示f*x*y,因此具有与乘法相同的优先级。特别是,x y + 2 = x*y + 2x y ^ 2 = x * y^2.

如何实现?

0 投票
1 回答
239 浏览

fparsec - 为什么 FParsec 使用列表?

我想我会尝试使用 FParsec 编写一个快速解析器,并很快意识到many返回列表是一个严重的性能问题。ResizeArray然后我发现了一个在文档中使用 a 的替代方法:

在我的代码中使用它会使其运行速度提高几倍。那么为什么 FParsec 默认使用列表而不是ResizeArray?