问题标签 [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 回答
731 浏览

f# - FParsec:如何组合解析器,以便它们以任意顺序匹配

任务是找到特定的键值对并解析它们。对可以以任何顺序出现。我的部分工作尝试:

因此,它可以工作,但有两个问题:明显的重复(jobId 函数中的“Job id”和顶级解析器中的“Job id”等),它需要“Job id”、“Status”和“Count” " 以这个特定的顺序排序,这在要求上是错误的。

我有一种强烈的感觉,有一个优雅的解决方案。

谢谢!

0 投票
1 回答
155 浏览

f# - 如果包裹在“中间”中,“sepEndBy”不会捕获

我想解析以下文本:

我从条件列表的组合器开始:

当我交出 where 语句的条件列表时(每行都有一个 =),我得到一个回复​​,其结果中有七个 WhereConditions。状态为“正常”。但错误列表包含“预期换行”错误消息。

但是,每当我尝试解析这种用圆括号括起来的列表时,它的开头带有一个操作符,并带有以下形状的组合器:

我收到状态为“错误”的回复。但是错误列表和结果都是空的。

所以我有点卡在这一点上。首先我不明白,为什么我的multiConditionWhereList中的sepByEnd1组合器会产生一个非空的错误列表并希望在末尾有一个换行符。更重要的是,当我将列表包装在 between 语句中时,我不明白为什么没有捕获该列表。

作为参考,我包括了整套规则以及导致问题的规则的调用:

0 投票
1 回答
370 浏览

regex - Fparsec 与正则表达式

使用像 FParsec 这样的库来解析文本与使用来自 .NET 语言的普通正则表达式相比有什么优势?

0 投票
1 回答
443 浏览

f# - 使用 FParsec 从大部分自由格式的文本中挑选块

我正在尝试从大部分自由格式的文本中解析一些信息。我尝试在 FParsec 中实现,但我之前没有使用过它,我不确定我是否做错了,或者即使它非常适合这个特定问题。

问题描述

我想从降价文档(“examplecode”和“requiredcode”标签)中解析出一组特定Liquid 标签的内容。降价将主要是自由格式的文本,偶尔会在 Liquid 标签中出现块,例如:

在这种情况下,我需要解析出[ "ABC\nDEF"; "GHI" ].

我所追求的解析逻辑可以命令式地表达。遍历每一行,如果我们找到一个我们感兴趣的开始标签,取行直到我们匹配结束标签并将这些行添加到结果列表中,否则跳过行直到下一个开始标签。重复。

这可以通过循环或折叠或正则表达式来完成:

\{%\s*(examplecode|requiredcode).*\%}(.*?)\{%\s*end\1\s*%\}

我的 FParsec 尝试

我发现很难用 FParsec 来表达上面的逻辑。我想写类似的东西between s t (everythingUntil t),但我不知道如何在不everythingUntil消耗结束令牌的情况下实现它,导致between失败。

我最终得到了以下内容,它不处理 的嵌套事件"{%",但似乎通过了我关心的主要测试用例:

然后我可以过滤标签以仅包含我感兴趣的标签。

这比基本实现(如正则表达式)所做的要多得多,例如描述性错误报告和更严格的输入格式验证(这既好又坏)。

更严格格式的一个后果是解析"{%"标签内的嵌套子字符串失败。我不确定如何调整它来处理这种情况(应该给出[ "ABC {% DEF " ]):

问题

有没有办法更紧密地表达 FParsec 中“问题描述”部分中描述的逻辑,或者输入的自由形式性质是否使 FParsec 比更基本的循环或正则表达式更不适合这个?

(我也对允许"{%"在标签中嵌套字符串的方法以及对我的 FParsec 尝试的改进感兴趣。我很乐意根据需要将其拆分为其他问题。)

0 投票
1 回答
63 浏览

parsing - FParsec:使用列表元素参数化`parray np`

问题是这样的:我知道我需要解析n的出现p,但我也有一个列表xs,我需要从中将一个元素传递给p每个应用程序。传递一个值p很容易parray n (p xs)——但我不知道我需要访问列表中的哪个元素。

实现这一目标的最干净的方法是什么?

0 投票
1 回答
276 浏览

parsing - 如何在 VS2013 中运行 FParsec

VS2013专业版如何运行FParsec?

我尝试使用以下 nuget 包:

我尝试自己编译https://bitbucket.org/fparsec/main的源代码并使用生成的 dll:FParsec.dllFParsecCS.dll

但无论哪种方式,我总是在运行教程代码时遇到以下异常:

谁能提供让 FParsec 在 VS2013 上运行的分步解决方案?

这是我尝试运行的代码:

0 投票
1 回答
1006 浏览

parsing - 如何使用 FParsec 解析字符串值

如何从另一个字符串中解析出一个简单的字符串。

在 FParsec 教程中,给出了以下代码:

我不想解析 backets 之间的浮点数,而是解析表达式中的字符串。

某事。像:

Location := LocationKeyWord path EOL

给定一个辅助函数

还有一个解析器功能:let pLocation = ...

当我打电话test pLocation "Location /root/somepath"

它应该打印"/root/somepath"

我的第一次尝试是修改教程代码如下:

但这给了我一个错误:

0 投票
2 回答
694 浏览

f# - 如何使用 FParsec 解析令牌列表

我正在尝试使用 FParsec 解析令牌列表,其中每个令牌是文本块或标签 - 例如:

这是一个{type of test}测试,它{成功或失败}

这是解析器:

以下测试有效:

但尝试运行令牌会导致异常:

我已经解决了这个 stackoverflow 问题,但我没有尝试过任何工作。我什至添加了以下内容,但我得到了同样的例外:

我认为问题是内容中的 stringsSepBy,但我想不出任何其他方法来获取带有转义项的字符串

任何帮助将不胜感激 - 我已经经历了几天,但无法弄清楚。

0 投票
1 回答
390 浏览

parsing - FParsec 选择以意想不到的方式表现

我计划将 FParsec 用于我的一个更大项目的原型。所以我决定通过下面列出的测试程序来获得我对这个库的第一次体验。但似乎通过使用 fparsec 'choice' 函数组合我的基本解析器(似乎工作)会产生意外行为。

基本上,目标是所有这些简单的计算器解析器代码总是返回数字或子表达式的乘积之和。子表达式依次应具有与整个表达式相同的结构。

正如我从“选择”的文档中了解到的那样,替代方案是从左到右尝试的,如提供给“选择”的解析器列表中指定的那样。我知道如果列表中左侧的解析器失败但消耗了输入,则不会尝试后续解析器。

然而,它似乎比我现在所能理解的要多,就像我上面所说的那样,代码应该可以工作。但它不起作用。

如果有人可以向我解释a)出了什么问题以及为什么以及b)如何解决它,将不胜感激。

在我的主要项目中,我计划根据一些输入计算解析器,因此我需要准确了解如何以可靠的方式组合解析器而不会出现意外。

在这里, $do test Sum "4 * 3 + 5 * 2" 失败,输出如下:

而且我什至没有最模糊的想法,为什么它会在这里期待'*'。

0 投票
2 回答
209 浏览

f# - 如何使用 FParsec 解析具有不同开始和结束字符的标识符

我很难找到解析开头和结尾字符不同的标识符的最佳方法。例如,假设我们的标识符的起始字符可能只有大写和小写,而标识符的中间也可能包含数字和冒号。标识符的结尾可能不是冒号,但可能是撇号。

所以以下都是合法的标识符:

但以下不是:

我看不出如何最好地处理回溯:中间有一个冒号很好,但我们需要一些前瞻来确定我们是否在标识符的末尾。

编辑:

感谢您的建议。使用正则表达式是一种务实的方法,但我觉得有点令人失望,否则似乎没有干净/明显的方式来做这件事。