问题标签 [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.
parsing - 无法使用正则表达式和 Scala 解析器组合器解析复杂语言
作为我研究的一部分,我正在尝试为某种语言编写解析器。目前,我无法让以下代码以我想要的方式工作:
上面的代码只包含了语言的一部分,为了节省时间和篇幅,我不会对整个语言进行过多的详细介绍。_uw 方法应该解析一个由三部分组成的字符串,尽管只有第一部分必须存在于字符串中。
_uw 应该能够正确解析这些测试字符串:
因此,如果词条以 开头和结尾"
,则双引号内的所有内容都被视为词条的一部分。所有以 开头的词.@
,如果它们不在双引号内,都是词条的属性。
例如在 test5 中,解析器应该解析test5.
为词条和attr
属性。只是 .@ 被省略,并且之前的所有点都应该包含在词条中。
因此,在词条之后可以有属性和/或修饰符。顺序是严格的,所以属性总是在修饰符之后。如果有属性但没有修饰符,则直到所有内容都.@
被视为词条的一部分。
主要问题是"[^@(]*".r
。我尝试了各种创造性的替代方案,例如"(^[\\w\\.]*)((\\.\\@)|$)".r
,但似乎没有任何效果。前瞻或后瞻甚至如何影响解析器组合器?我不是解析或正则表达式方面的专家,所以欢迎所有帮助!
scala - 解析器组合器: repsep 是否允许回溯?
考虑这样的解析器示例:
如果我尝试解析这个输入(没有两行包含排除工作正常):
我收到以下错误:
问题很明显这一行:
不起作用的原因是什么。跟回溯有关系吗?我必须使用哪些替代方法才能使其发挥作用?
f# - FParsec 标识符与关键字
对于具有关键字的语言,需要发生一些特殊的技巧来防止例如“if”被解释为标识符,以及“ifSomeVariableName”在令牌流中成为关键字“if”后跟标识符“SomeVariableName”。
对于递归下降和 Lex/Yacc,我只是采用了在词法分析器和解析器之间转换令牌流的方法(根据有用的指令)。
但是,FParsec 似乎并没有真正做一个单独的词法分析器步骤,所以我想知道处理这个问题的最佳方法是什么。说到这里,Haskell 的 Parsec 似乎支持词法分析器层,但 FParsec 不支持?
scala - 解析“elem”方法前面的空格
我试图解析两个 Ints 和一些元素的输入和结尾:
方法中给出了一个示例输入go
。Ints 和末尾的元素必须用空格分隔。但这仅适用于 Ints 而不适用于元素。当我输入
我收到以下错误:
但是当我输入
我得到:
最后我想要一个Parser[Int ~ Int ~ List[List[Char]]]
. 为什么在前面插入空格elem
不起作用?我怎样才能让这个代码工作?
f# - FParsec 反应式示例
我希望有人可能会发布一个使用 FParsec 的示例,其中数据基于某种传入的实时流。
一些示例可能是基于鼠标手势生成结果,基于特定的股票报价序列生成警报或通知。
如果有人可以发布一个示例,将不胜感激。
谢谢!
scala - 使用 Scala 的解析器组合器时,如何忽略不匹配的前面文本?
我真的很喜欢解析器组合器,但是当我不关心相关文本之前的文本时,我对提取数据的解决方案不满意。
考虑这个小解析器来获取货币金额:
如您所见,Amount
如果我给解析器一个以有效数据开头的字符串,我可以轻松地返回 s:
但是,当前面有不匹配的文本时,它会失败:
我的解决方案是amountNested
解析器,它在其中递归地尝试找到一个Amount
. 这有效,但它给出了一个ParseResult[Any]
:
这种类型信息的丢失(当然可以使用模式匹配“检索”)似乎很不幸,因为任何成功都将包含一个Amount
.
有没有办法继续搜索我的输入("I have 101.41 EUR"
),直到我有一个匹配或没有但没有一个Parser[Any]
?
查看ScalaDocs似乎该*
方法Parser
可能会有所帮助,但是当我尝试以下操作时,我得到的只是失败或无限循环:
parsing - 解析包含任何字符的字符串
我正在努力让追随者工作。所以我有括号内的字符串。字符串可以包含任何字符,因此我要解析的字符串也可以包含括号。我认为正则表达式当前也匹配应该由 <~ ")" 匹配的最后一个括号,因此解析失败。我在这里想念什么?
这应该解析以下类型的字符串:
因此,“a”解析器解析字符串,直到打开括号或 .@attr 部分。“b”解析器解析可选括号内的字符。"c" 解析可选的 .@attrs。
目前我在所有包含括号部分的测试字符串上都收到类似的错误:
所以我假设解析器正确解析了第一部分,但是当它看到括号部分时失败了。
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看起来很有趣,但不使用解析器组合器。
parsing - 使用 parser-combinators 解析 Scala 句子
如何有效地解析(没有太多代码混乱)语句,如下所示?关键字/分隔符放在 [] 内。
德里经理 [for] The Company Pvt Ltd. [从] 2009 年 1 月 [至] 2012 年 1 月。
将使用解析组合器从文本中提取人名、公司名称和日期范围。(预期输出显示在底部)
以下是为上述内容编写的代码 -
输出应该类似于
另外,如何删除上面文本中出现的不需要的“~”。
谢谢,帕万
regex - 使用解析器组合器整理文本行
我正在尝试使用解析器组合器解析文本文件。我想在一个名为Example
. 这是一个显示输入文件表单的测试:
这是我的尝试不起作用:
它失败了:
我只是从这些开始,所以我不太清楚我在做什么。我认为问题可能与".*".r
正则表达式不做多行有关。如何更改它以使其正确解析?