问题标签 [parser-combinators]

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

parsing - 无法使用正则表达式和 Scala 解析器组合器解析复杂语言

作为我研究的一部分,我正在尝试为某种语言编写解析器。目前,我无法让以下代码以我想要的方式工作:

上面的代码只包含了语言的一部分,为了节省时间和篇幅,我不会对整个语言进行过多的详细介绍。_uw 方法应该解析一个由三部分组成的字符串,尽管只有第一部分必须存在于字符串中。

_uw 应该能够正确解析这些测试字符串:

因此,如果词条以 开头和结尾",则双引号内的所有内容都被视为词条的一部分。所有以 开头的词.@,如果它们不在双引号内,都是词条的属性。

例如在 test5 中,解析器应该解析test5.为词条和attr属性。只是 .@ 被省略,并且之前的所有点都应该包含在词条中。

因此,在词条之后可以有属性和/或修饰符。顺序是严格的,所以属性总是在修饰符之后。如果有属性但没有修饰符,则直到所有内容都.@被视为词条的一部分。

主要问题是"[^@(]*".r。我尝试了各种创造性的替代方案,例如"(^[\\w\\.]*)((\\.\\@)|$)".r,但似乎没有任何效果。前瞻或后瞻甚至如何影响解析器组合器?我不是解析或正则表达式方面的专家,所以欢迎所有帮助!

0 投票
1 回答
1268 浏览

scala - 解析器组合器: repsep 是否允许回溯?

考虑这样的解析器示例:

如果我尝试解析这个输入(没有两行包含排除工作正常):

我收到以下错误:

问题很明显这一行:

不起作用的原因是什么。跟回溯有关系吗?我必须使用哪些替代方法才能使其发挥作用?

0 投票
2 回答
995 浏览

f# - FParsec 标识符与关键字

对于具有关键字的语言,需要发生一些特殊的技巧来防止例如“if”被解释为标识符,以及“ifSomeVariableName”在令牌流中成为关键字“if”后跟标识符“SomeVariableName”。

对于递归下降和 Lex/Yacc,我只是采用了在词法分析器和解析器之间转换令牌流的方法(根据有用的指令)。

但是,FParsec 似乎并没有真正做一个单独的词法分析器步骤,所以我想知道处理这个问题的最佳方法是什么。说到这里,Haskell 的 Parsec 似乎支持词法分析器层,但 FParsec 不支持?

0 投票
1 回答
229 浏览

scala - 解析“elem”方法前面的空格

我试图解析两个 Ints 和一些元素的输入和结尾:

方法中给出了一个示例输入go。Ints 和末尾的元素必须用空格分隔。但这仅适用于 Ints 而不适用于元素。当我输入

我收到以下错误:

但是当我输入

我得到:

最后我想要一个Parser[Int ~ Int ~ List[List[Char]]]. 为什么在前面插入空格elem不起作用?我怎样才能让这个代码工作?

0 投票
1 回答
386 浏览

f# - FParsec 反应式示例

我希望有人可能会发布一个使用 FParsec 的示例,其中数据基于某种传入的实时流。

一些示例可能是基于鼠标手势生成结果,基于特定的股票报价序列生成警报或通知。

如果有人可以发布一个示例,将不胜感激。

谢谢!

0 投票
1 回答
538 浏览

scala - 使用 Scala 的解析器组合器时,如何忽略不匹配的前面文本?

我真的很喜欢解析器组合器,但是当我不关心相关文本之前的文本时,我对提取数据的解决方案不满意。

考虑这个小解析器来获取货币金额:

如您所见,Amount如果我给解析器一个以有效数据开头的字符串,我可以轻松地返回 s:

但是,当前面有不匹配的文本时,它会失败:

我的解决方案是amountNested解析器,它在其中递归地尝试找到一个Amount. 这有效,但它给出了一个ParseResult[Any]

这种类型信息的丢失(当然可以使用模式匹配“检索”)似乎很不幸,因为任何成功都将包含一个Amount.

有没有办法继续搜索我的输入("I have 101.41 EUR"),直到我有一个匹配或没有但没有一个Parser[Any]

查看ScalaDocs似乎该*方法Parser可能会有所帮助,但是当我尝试以下操作时,我得到的只是失败或无限循环:

0 投票
1 回答
294 浏览

parsing - 解析包含任何字符的字符串

我正在努力让追随者工作。所以我有括号内的字符串。字符串可以包含任何字符,因此我要解析的字符串也可以包含括号。我认为正则表达式当前也匹配应该由 <~ ")" 匹配的最后一个括号,因此解析失败。我在这里想念什么?

这应该解析以下类型的字符串:

因此,“a”解析器解析字符串,直到打开括号或 .@attr 部分。“b”解析器解析可选括号内的字符。"c" 解析可选的 .@attrs。

目前我在所有包含括号部分的测试字符串上都收到类似的错误:

所以我假设解析器正确解析了第一部分,但是当它看到括号部分时失败了。

0 投票
2 回答
714 浏览

parsing - Scala 地图解析器

我想构建一个可以接受 Map 输入并输出 Case 类的 Parser。现在我有一些似乎没有利用 FP 的命令式代码。我只是看不到如何构建一个可以输出 Case 类的 Parser。

这是我所拥有的:

更新: 我想我应该更清楚我想做一些类似于 Anorm 但使用 scala 中的 Parser Combinators 的事情。上述问题是不灵活或不可重用的。调用者必须拿走他们得到的东西。

我希望解析器组合器将是解析 Map 形式结果的正确方法。正如您可能已经猜到的那样,我正在使用 DyanmoDB。

更新2: 显然我不能很好地解释这个问题。我要做的就是编写一个或多个 Pareser 组合器,它们可以使用调用者指定的绑定将 Map 转换为调用者选择的 Case 类。输入映射 => 输出案例类

更新 3: https ://github.com/wfaler/scala-dynamo看起来很有趣,但不使用解析器组合器。

0 投票
1 回答
374 浏览

parsing - 使用 parser-combinators 解析 Scala 句子

如何有效地解析(没有太多代码混乱)语句,如下所示?关键字/分隔符放在 [] 内。

德里经理 [for] The Company Pvt Ltd. [从] 2009 年 1 月 [至] 2012 年 1 月。

将使用解析组合器从文本中提取人名、公司名称和日期范围。(预期输出显示在底部)

以下是为上述内容编写的代码 -

输出应该类似于

另外,如何删除上面文本中出现的不需要的“~”。

谢谢,帕万

0 投票
3 回答
342 浏览

regex - 使用解析器组合器整理文本行

我正在尝试使用解析器组合器解析文本文件。我想在一个名为Example. 这是一个显示输入文件表单的测试:

这是我的尝试不起作用:

它失败了:

我只是从这些开始,所以我不太清楚我在做什么。我认为问题可能与".*".r正则表达式不做多行有关。如何更改它以使其正确解析?