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

f# - 避免通用使用返回两个函数的函数的值限制错误

我想使用带有通用 Expr 联合的 FParsec createParserForwardedToRef 函数,如下所示:

我无法摆脱价值限制错误。我不能变成exprCLR 函数,更不用说exprR.

我通常会如何处理这种情况?

0 投票
2 回答
241 浏览

parsing - 用 FParsec 解析器组合器表示 epsilon 产生式

在 BNF 中表达语法产生式通常很方便,例如

其中 ε 表示一个空的产生式规则;即,非终结符“A”可以扩展为终结符“car”、“bike”或什么都没有。但是,除非我重构我的语法,否则我不清楚如何在 FParsec 中表示这样的语法。我知道“选择”组合器,<|>但据我所知,没有“空”组合器。即,返回 true 且不消耗任何输入的组合器。

我已经搜索了 FParsec 文档的高低,但我没有找到任何这样做的东西,这让我感到惊讶,因为这似乎是一个常见的场景。我对 FParsec (以及一般的组合器)相当陌生,所以也许我只是没有使用正确的词。有什么提示吗?

0 投票
1 回答
116 浏览

f# - Fparsec v. 0.9.2(新手)中的空白在哪里?

在 Fparsec V.0.8 中,有FParser.CharParser.whitespace. 但是在 Fparsec 0.9.2 中,没有FParser.CharParser.whitespace.Fparsec v. 0.9.2 中的空格在哪里?

当我尝试编译项目“用 F# 在 48 小时内为自己编写一个方案”(访问http://code.msdn.microsoft.com/Write-Yourself-a-Scheme-in-d50ae449)时,遇到了问题。

0 投票
1 回答
333 浏览

f# - 如何使用 fparsec 测试正好 2 个字符?

我有以下运行的程序。它需要一行文本并将其分成两部分,第一部分是标识符,第二部分是该行的其余部分。我的标识符(factID)解析器将任何字符串作为标识符,这不是(完全)我想要的。我想要的是一个解析器,它只有在遇到两个连续的大写字母时才会成功。因此,例如“AA”应该成功,而“A”、“A1”或“AAA”不应该。

我想不通的是如何构造一个寻找固定长度令牌的解析器。我想也许 CharParsers.next2CharsSatisfy 可能是我正在寻找的功能,但我不知道如何正确使用它。

0 投票
3 回答
539 浏览

parsing - 使用 FParsec 解析日期和时间

在简单的查询语言中,我想识别日期和时间文字,最好不使用分隔符。例如,

我可以使用组合器来检测基本语法(例如,yyyy-MM-dd hh:mm tt),但随后需要将其传递给以DateTime.TryParse进行完全验证。

几个问题:

  • 是否有用于“后处理”解析器结果的组合器,例如,pstring "1/2/2000" |> (fun s -> try OK(DateTime.Parse s) with _ -> Fail("not a date"))
  • 是否可以将谓词应用于字符串(就像satisfyto一样char)?
  • 有没有更好的方法来解析日期/时间?

更新

使用 Guvante 和 Stephan 的例子,我想出了这个:

0 投票
2 回答
240 浏览

f# - 解析器标识符和自由格式文本。这可以用 FParsec 完成吗?

作为后续:如何使用 fparsec 测试恰好 2 个字符?

我需要解析一个字符串,该字符串由成对的标识符组成,后跟自由格式的文本。我可以很容易地构造一个解析器,它可以找到形式为换行符的标识符,后跟两个大写字符,后跟一个空格。与前一个标识符相关联的自由格式文本是标识符之后的所有内容,但不包括下一个标识符。

例如:

包含两个标识符ABCD两个自由格式文本

Now is the \ntime for all good men.
Four score and seven years ago EF our.

我的问题是我不知道如何构建一个匹配自由格式文本但不匹配标识符的解析器。这是我需要回溯的情况吗?

这可以做到吗?如果可以,怎么做?

0 投票
1 回答
158 浏览

f# - 两次解析完整的输入

为了使用 实现不区分大小写的中缀运算符OperatorPrecedenceParser,我正在预处理输入,将其解析为由字符串文字分隔的文本。然后在文本部分搜索需要大写的中缀运算符(以符合 已知的运算符OPP)。然后进行实际的解析。

我的问题是,这两个阶段可以组合成一个解析器吗?我试过

但它在输入结束时失败,似乎期待一个scalarExpr. 输入可以独立地解析preprocessscalarExpr所以我猜这是一个问题eof,但我似乎无法正确理解。这可能吗?

这是其他解析器供参考。

0 投票
1 回答
533 浏览

f# - FParsec 在许多方面都失败了

我有这个测试程序:

{test part s} 行按预期工作,但下一行 {test (many part) s} 失败,我不明白我做错了什么。

编辑:

为了澄清,我想做的是让 {test (many part) s} return ["AA 12345\nBB 6789"; “CC 9876\nDD 54321”]。换句话说,我所拥有的是一个由“pars”或“chunks”组成的输入字符串,这些字符串由带有所有破折号的行分隔。对于输出,我想要一个数组,其中每个元素都是部分之一,并且带有破折号的行被简单地丢弃。

0 投票
1 回答
173 浏览

parsing - FParsec - 解析器序列

假设我有一些文字:

三个解析器 foo、bar 和 baz 分别用于字符串 'foo'、'bar' 和 'baz'。

我将如何创建一个可以给我结果的解析器:

什么时候针对上面的输入运行?基本上在构建列表时尝试每种可能性,直到失败。我可以使用用户状态,但如果可能的话我想避免。(我想让各个解析器自己不知道用户状态)

我得到的最接近的是下面的 fooseq:

在我看来,必须有更好的方法来做到这一点?

0 投票
1 回答
157 浏览

f# - 为什么组合子“之间”不能与“选择”作为应用解析器一起使用?

据我了解,选择组合器隐式地将pzero解析器附加到我的解析器列表中,并且当 fparsec 无法解析输入流的下一部分时,它应该搜索括号。

这是最小的完整代码:

但对于输入字符串

我收到以下错误: