问题标签 [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 投票
3 回答
579 浏览

f# - 使用 FParsec 解析自描述输入

我正在使用 FParsec 来解析描述其自身格式的输入。例如,考虑这个输入:

输入的第一部分(冒号之前)描述了输入第二部分的格式。在这种情况下,格式是int, str, int,这意味着实际数据由给定类型的三个逗号分隔值组成,因此结果应该是4, "hello", 3

使用 FParsec 解析此类内容的最佳方法是什么?

我已经在下面粘贴了我的最大努力,但我对此并不满意。有没有更好的方法来做到这一点,更干净,更少有状态,更少依赖于parsemonad?我认为这取决于对 UserState 的更智能管理,但我不知道该怎么做。谢谢。

0 投票
1 回答
878 浏览

parsing - How to parse a very large file in F# using FParsec

I'm trying to parse a very large file using FParsec. The file's size is 61GB, which is too big to hold in RAM, so I'd like to generate a sequence of results (i.e. seq<'Result>), rather than a list, if possible. Can this be done with FParsec? (I've come up with a jerry-rigged implementation that actually does this, but it doesn't work well in practice due to the O(n) performance of CharStream.Seek.)

The file is line-oriented (one record per line), which should make it possible in theory to parse in batches of, say, 1000 records at a time. The FParsec "Tips and tricks" section says:

If you’re dealing with large input files or very slow parsers, it might also be worth trying to parse multiple sections within a single file in parallel. For this to be efficient there must be a fast way to find the start and end points of such sections. For example, if you are parsing a large serialized data structure, the format might allow you to easily skip over segments within the file, so that you can chop up the input into multiple independent parts that can be parsed in parallel. Another example could be a programming languages whose grammar makes it easy to skip over a complete class or function definition, e.g. by finding the closing brace or by interpreting the indentation. In this case it might be worth not to parse the definitions directly when they are encountered, but instead to skip over them, push their text content into a queue and then to process that queue in parallel.

This sounds perfect for me: I'd like to pre-parse each batch of records into a queue, and then finish parsing them in parallel later. However, I don't know how to accomplish this with the FParsec API. How can I create such a queue without using up all my RAM?

FWIW, the file I'm trying to parse is here if anyone wants to give it a try with me. :)

0 投票
1 回答
97 浏览

f# - 使用 fparsec 应用从子解析器返回的函数

菜鸟警报!

好的,我正在尝试在 fparsec 中构建一个简单的数学表达式解析器。现在我想要它做的就是处理像这样的字符串“1+2-3*4/5”并返回一个双精度值作为评估的结果。没有空格、换行符或括号,从左到右的操作顺序很好。

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

在表达式解析器的第一选择中,我不确定如何应用op解析器返回的函数。

0 投票
0 回答
145 浏览

parsing - 如何创建一个检查字符串是否包含在数组中的 FParsec 解析器?

我正在尝试创建一个解析器,它可以识别预定义函数的名称,而不是一般/随机字符串文字。

我正在寻找从以下代码作为函数定义开始的解析器:let pArray (arr:'a[]) :Parser<'a> =...但我不确定如何继续。

简而言之,我认为我需要以某种方式从类型中获取CharStream(作为字符串)Parser<'a>并将其与数组中包含的内容进行比较。只是不确定如何实现这一目标?

另一种选择是创建一个字符串解析器数组 - 一个用于数组的每个元素并将它们与替代组合器一起应用/组合<|>到一个解析器中。考虑到我有大约 400 个不同的功能,这似乎(没有证据)过于严厉。是否可以创建具有这么多替代方案的解析器,或者性能是否会受到过度压力?

我在 FParsec 用户指南中进行了搜索,但找不到与这种情况相匹配的内容 - 我是在正确的道路上还是这不是我应该解决这个问题的方式?

0 投票
1 回答
221 浏览

f# - 如何在 FParsec 中添加解析后的数字必须满足的条件?

我正在尝试使用 FParsec 解析 int32,但有一个额外的限制,即该数字必须小于某个最大值。他们是一种无需编写我自己的自定义解析器(如下所示)即可执行此操作的方法和/或我的自定义解析器(如下所示)是实现要求的适当方式。

我问是因为大多数内置库函数似乎都围绕满足某些谓词的char而不是任何其他类型。

更新

以下是基于以下评论中给出的方向的更合适的 FParsec 解决方案的尝试:

这是正确的方法吗?

0 投票
0 回答
273 浏览

parsing - 如何将 FParsec 用于基于缩进的语句(如在 python 中)?

所以,我有我的语言的基本解析器,并且根据Is possible to parse "off-side" (indentation-based) 语言与 fparsec?

我想为它合并基于缩进的语法,就像在 python 中一样。

但是,我很难看到如何将 indentationParser 与我的合并,它们与类型不匹配发生冲突。

在我的语言中,“do”之后的任何内容都是新的范围,并且需要标识:

错误在该行中:

0 投票
1 回答
163 浏览

f# - fparsec 解析不同数据类型的键值对

我正在尝试编写一个解析器,它可以解析键值对,键值对可能因值数据类型而异。

KEY1:1,2,3

KEY2:abc

键3:123

使用以下代码

上面给出了以下错误:

我认为这与numList解析器有关,因为取出第一个密钥按预期工作。

感谢任何帮助!提前致谢!

0 投票
1 回答
327 浏览

visual-studio-2012 - 兼容 .Net 4.0 和 .Net 4.5。无法加载文件或程序集“FSharp.Core,版本=4.3.1.0。”

我想在 F# 项目中使用库 Math.NET Symbolics。但是当我运行简单的代码时:

...

我有:

我在Math.NET论坛中创建了一个主题

在讨论中,我认为不可能,因为我只有.Net 4.5和VS2012(因此我不能使用F#3.1)。

但我不明白,如果在 .Net 4.0 中一切正常,为什么我不能在 .Net 4.5 中正常使用。兼容版本呢?

问题:这甚至可能吗?而且,如果可能的话,怎么做?

编辑:

当 app.config 有:

此代码工作正常:

但我需要使用解析器来解析数学表达式。因此,这个选项不适合我。

更新:

回答:

编译失败后,Visual Studio 被更改为从标准 FSharp.Core 4.3.0.0 的包文件夹中引用 FSharp.Core。当我设置属性“复制本地”=“真”时,问题就解决了。

现在编码

给出另一个例外:

我正在寻找一个没有的错误。问题不在于依赖。因为不使用 FParces 的代码有效!

在包的页面上写如下:

“这个包使用 FParsec 的基本“低信任”配置,它不使用任何无法验证的代码,并针对最大的可移植性进行了优化。如果您需要解析非常大的文件,或者如果您将 FParsec 用于性能关键的工作,请考虑使用备用“大数据版”NuGet 包(请参阅 nuget.org/packages/fparsec-big-data-edition)。”

所以,我在FParsec(大数据版)上更改了 FParsec ,一切正常!

PS我尝试更改绑定重定向没有意义=)只需写:

0 投票
1 回答
161 浏览

f# - 使用 FParsec 解析 float 或 int*float

我刚开始玩 FParsec,现在我正在尝试解析以下格式的字符串

例如,我想将 3*0.1 扩展为 0.1 0.1 0.1

到目前为止我所拥有的是以下

产品解析器正确解析格式条目int*float并将其扩展为浮点列表。但是,我在想出一个允许我解析int*float一个浮点数或只解析一个浮点数的解决方案时遇到了麻烦。我想做类似的事情

这当然行不通,因为解析器的返回类型不同。关于如何使这项工作的任何想法?是否可以包装修改 float_ws 使其返回一个只有一个浮点数的列表?

0 投票
1 回答
635 浏览

f# - 使用 FParsec 解析 int 或 float

我正在尝试使用 FParsec 解析一个文件,该文件由 float 或 int 值组成。我面临着两个我找不到好的解决方案的问题。

1

两者pint32pfloat都会成功解析同一个字符串,但给出不同的答案,例如解析字符串时pint32返回,解析同一个字符串时返回。是否可以尝试使用解析浮点值并在字符串为时失败?3"3.0"pfloat3.0pint32"3.0"

换句话说,有没有办法使以下代码工作:

这段代码会正确地将所有浮点值放入floatvalues列表中,但由于解析字符串时pfloat返回,所有整数值也会放入列表中。"3.0""3"floatvalues

2

上面的代码示例对我来说似乎有点笨拙,所以我猜一定有更好的方法来做到这一点。我考虑使用组合它们choice,但是两个解析器必须返回相同的类型才能工作。我想我可以使用一个选项用于浮点数和一个选项用于 int 来创建一个有区别的联合,pint32pfloat使用|>>运算符转换输出。但是,我想知道是否有更好的解决方案?