问题标签 [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.
parsing - fparsec - 组合器“许多”抱怨......为什么不解析这样的块评论?
这个问题,首先,不是我的问题的重复。其实我有3个问题。
在下面的代码中,我尝试创建一个解析器来解析可能嵌套的多行块注释。与引用的其他问题相比,我尝试以直接的方式解决问题,而不使用任何递归函数(请参阅另一篇文章的已接受答案)。
我遇到的第一个问题是 FParsec 的 skipManyTill 解析器也使用流中的结束解析器。所以我创建了skipManyTillEx(Ex for ' exclude endp' ;))。skipManyTillEx 似乎工作 - 至少对于我也添加到 fsx 脚本的一个测试用例。
然而,在显示的代码中,现在我得到“组合器'许多'被应用于一个成功但不消耗......的解析器”错误。我的理论是,commentContent
解析器是产生此错误的行。
在这里,我的问题:
- 有什么理由,为什么我选择的方法行不通?1中的解决方案,不幸的是,它似乎无法在我的系统上编译,它使用递归低级解析器来处理(嵌套)多行注释。
- 任何人都可以看到我实施方式的问题
skipManyTillEx
吗?我实现的方式和实现的方式有一定的区别skipManyTill
,主要是在如何控制解析流程方面。在 originalskipManyTill
中,Reply<_>
p 和 endp 的 与 一起被跟踪stream.StateTag
。在我的实现中,相比之下我没有看到需要使用stream.StateTag
,仅依赖Reply<_>
状态码。如果解析不成功,skipManyTillEx
则回溯到流初始状态并报告错误。回溯代码可能会导致“许多”错误吗?我该怎么做呢? - (这是主要问题) - 有没有人看到,如何修复解析器,这个“很多......”错误消息消失了?
这是代码:
f# - fparsec 键值解析器解析失败
我必须编写一个解析器来解析文件中的键值对,如下所示:
as235 242kj25klj 对:A=a1|B=b1|C=c1
kjlkjlkjlkj 对:A=a2|B=b2|C=c2
请注意,这些行包含一些垃圾、标签和键值对。
我编写的 F# 代码如下:
预期结果是:
...但是我收到以下错误:
关于如何修复此解析器的任何想法?
谢谢!
更新:在斯蒂芬发表评论后,我试图修复它但没有成功。这是我希望工作的最后一次尝试,但事实并非如此。
现在错误消息是:
sdp - 如何使用 FParsec 解析成记录或对象?
完成 FParsec 教程后,我决定尝试为 SDP(会话描述协议 RFC 4366)编写解析器——至少前 3 行。SDP 在 ABNF (RFC 4234) 中指定;所以,我正在努力解决这个问题。
用户指南第 5.1 节末尾的注释指出了“您从语法叶节点的简单解析器开始,然后逐步进行,直到最终获得完整语法的解析器”。有了这个方向和斯蒂芬回答使用管道的提示,这就是我现在所拥有的:
这有效(除了 getAddress 不处理 FQDN 或外部地址),结果如下:
现在这是目标记录类型 Sdp。但通过一些元组将结果输入输出是一种有点复杂的方式。
我已经阅读了用户指南到第 5.4 节,但所有示例都解析为有区别的联合。Record类型是整理结果的最佳选择;或者,还有更好的方法?
f# - 如何在重复模式之后解析正确的时间?
您将如何使用现有的 FParsec 功能在最右边的标记中查找重复的连续模式?
在这种情况下,这是一种合理的可能性。预解析+转义可能有效,但有更好的解决方案吗?我们是否需要编写一个新的前向组合器,如果需要,它是什么样的?
f# - F#、FParsec 和递归调用流解析器
我正在使用 F# 和 FParsec 开发一个多部分 MIME 解析器。我正在迭代开发,所以这是高度未精炼、脆弱的代码——它只解决了我的第一个直接问题。红色,绿色,重构。
我需要解析一个流而不是一个字符串,这真的让我陷入了循环。鉴于该约束,据我所知,我需要递归调用解析器。如何做到这一点超出了我的理解,至少以我迄今为止的方式进行。
示例 POST 的第一行如下:
content-type: Multipart/related; boundary="RN-Http-Body-Boundary"; type="multipart/related"
它跨越文件中的一行。内容中的其他子部分包括content-type
跨越多行的值,所以我知道如果要重用它们,我必须改进我的解析器。
我必须以某种方式调用pContent
(字符串?)结果,pBoundary
以便我可以在适当的边界上拆分流的其余部分,然后以某种方式返回帖子内容的多个部分,每个部分都是单独的post,带有标题和内容(显然必须是字符串以外的内容)。我的头在旋转。这段代码看起来太复杂了,无法解析一行。
非常感谢洞察力和智慧!
recursion - F#、FParsec 和递归调用流解析器,第二次
感谢您对我的第一篇文章和我关于这个项目的第二篇文章的回复。这个问题与第一个问题基本相同,但我的代码根据收到的关于这两个问题的反馈进行了更新。如何递归调用我的解析器?
我在挠头,茫然地盯着代码。我不知道从这里去哪里。那是我转向stackoverflow的时候。
我在代码注释中包含了我收到的编译时错误。一个绊脚石可能是我受歧视的工会。我与受歧视的工会合作的不多,所以我可能会错误地使用我的工会。
我正在使用的示例 POST(我在前两个问题中包含的部分内容)由一个边界组成,该边界包括具有新边界的第二个帖子。第二个帖子包括由第二个边界分隔的几个附加部分。这几个附加部分中的每一个都是由标题和 XML 组成的新帖子。
我在这个项目中的目标是构建一个在我们的 C# 解决方案中使用的库,该库采用流并将 POST 递归地解析为标题和部分。我真的希望 F# 在这里大放异彩。
编辑
为了回应我迄今为止收到的反馈(谢谢!),我做了以下调整,收到注释的错误:
我尝试加入Reply ()
s,但它们只是返回解析器,意思是c
上面变成了 aParser<...>
而不是Content
. 这似乎是一种倒退,或者至少是在错误的方向上。不过我承认我的无知,欢迎指正!
parsing - 是否可以使用 fparsec 解析“越位”(基于缩进的)语言?
我希望将 FParsec 用于类似 python 的基于缩进的语言。
我知道这必须在词法分析阶段完成,但 FParsec 没有词法分析阶段。是否可以使用 FParsec,或者,如何在词法分析后提供它?
PD:我是 F# 新手,但在其他语言方面经验丰富
f# - 以乘法的优先级解析“xy z”
我正在尝试使用 FParsec 在 F# 中为 Mathematica 语言编写解析器。
我为 MiniML 编写了一个,它支持f x y = (f(x))(y)
函数应用的高优先级语法。现在我需要使用相同的语法来表示f*x*y
,因此具有与乘法相同的优先级。特别是,x y + 2 = x*y + 2
而x y ^ 2 = x * y^2
.
如何实现?
fparsec - 为什么 FParsec 使用列表?
我想我会尝试使用 FParsec 编写一个快速解析器,并很快意识到many
返回列表是一个严重的性能问题。ResizeArray
然后我发现了一个在文档中使用 a 的替代方法:
在我的代码中使用它会使其运行速度提高几倍。那么为什么 FParsec 默认使用列表而不是ResizeArray
?