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

scala - Scala:如何组合来自不同对象的解析器组合器

给定一系列实现解析器组合器的对象,我如何组合解析器?由于Parsers.Parser是一个内部类,并且在 Scala 中,内部类绑定到外部对象,所以故事变得稍微复杂一些。

这是一个尝试组合来自不同对象的两个解析器的示例。

这导致以下错误:

我已经找到了解决这个问题的方法,但是由于它最近是在 scala-user ML 上提出的(将一个解析器注入另一个解析器时出现问题),因此可能也值得将它放在这里。

0 投票
1 回答
266 浏览

scala - 解析器组合器信息

我在 scala 中使用解析组合器如果我有递归解析器:

如何检查我的解析器消耗了多少个输入字符?

0 投票
2 回答
526 浏览

parsing - scala中递归解析器的高级控制

此递归解析器将尝试解析 "(?ui)(regexvalue)".r 直到输入结束。当某些定义数量的字符被“无趣的东西”消耗时,scala 是否有一种禁止解析的方法?

UPD:我有一个糟糕的解决方案:

缺点:
- 并非所有成员都是惰性 val,因此 PackratParser 将有一些时间损失
- 在每个“无趣”的方法调用上构造正则表达式 - 时间损失
- 使用异常来控制程序 - 代码风格和时间损失

0 投票
2 回答
559 浏览

scala - Scala解析器组合器:如果x可以包含“)”,如何解析“if(x)”

我试图让它工作:

其中regularStr被定义为接受许多东西,包括“)”。当然,我希望这是一个可接受的输入:if(foo())。但是对于任何if(x),它都将“)”作为regularStr的一部分,所以这个解析器永远不会成功。

我错过了什么?

编辑

regularStr 不是正则表达式。它是这样定义的:

符号是:

我不需要详尽的语言检查,只需要控制结构。所以我真的不在乎 if() 中的“()”里面是什么,我想接受任何标识符、符号等序列。所以,为了我的目的,即使()))应该是有效的,其中“)) " 是 if 的“条件”。

0 投票
2 回答
2321 浏览

scala - 如何进一步改进基于 Scala 解析器组合器的解析器中的错误消息?

我编写了一个基于 Scala 解析器组合器的解析器:

通常产生的解析错误消息相当不错。但有时它变得只是

如果引号字符未关闭并且解析器到达 EOT,则会发生这种情况。我想在这里看到的是 (1) 解析器在预期 '"' (我有多个)和 (2) 在输入中该生成开始解析的位置(这是一个指示符开始报价在输入中)。有谁知道我如何改进错误消息并在错误发生时包含有关实际内部解析状态的更多信息(也许像生产规则堆栈跟踪或任何可以在此处合理给出的东西以更好地识别错误位置)顺便说一句,上面的“第 32 行,第 1 列”实际上是 EOT 位置,因此当然在这里没有用处。

0 投票
1 回答
647 浏览

http - Packrat 解析 HTTP

有人可以让我开始了解如何使用 scala 2.8 packrat-parsing 解析 HTTP 协议吗?

我需要将附加的示例 HTTP 响应解析为

  • 响应状态代码:Int
  • 标题:列表[(字符串,字符串)]
  • 正文:String、Array[Byte]、CharBuffer 或其他

非常感谢 Packrat-Parser 的简短示例用法。谢谢!

0 投票
3 回答
3240 浏览

scala - 词法分析器/解析器从 BNF 语法生成 Scala 代码

我目前正在寻找从 BNF 语法(ocamlyacc具有优先级和关联性的文件)生成 Scala 代码的词法分析器/解析器。我很困惑,因为我几乎没有发现如何去做。

对于解析,我发现scala-bison(我有很多麻烦)。所有其他工具都只是导入到 Scala 中的 Java 解析器(如ANTLR)。

对于词法分析,我一无所获。

我还找到了著名的 Scala解析器组合器,但是(如果我错了,请纠正我),即使它们非常吸引人,它们也会消耗大量时间和内存,主要是由于回溯

所以我有两个主要问题:

  • 为什么人们似乎只专注于 _parser 组合器?
  • 与 Scala 一起使用的最佳词法分析器/解析器生成器建议是什么?
0 投票
2 回答
1219 浏览

scala - 从 Scala 解析器组合器中过滤标记

使用 Scala 解析器组合器时,如何过滤从 Lexer 到 Parser 的标记序列?

让我解释一下——假设我有相当标准的 Lexer(扩展StdLexical)和 Parser(扩展StdTokenParsers)模式。词法分析器将字符序列转换为标记序列,然后解析器将标记序列转换为抽象语法树(类型为Expr)。

我决定一些可能出现在流中任何位置的标记,我希望可以选择过滤掉,所以我想要一个适合 Lexer 和 Parser 之间的函数来删除这些标记。例如,我可能希望词法分析器标记注释,然后过滤掉这些注释。

编写此过滤器的最佳方法是什么?这可以使用解析器组合成语,但不是必须的。

示例当前代码:

我希望能够写出这样的东西:

0 投票
2 回答
3886 浏览

scala - 递归 bnf 的 Scala Parser Combinators 技巧?

我试图匹配这个语法:

我的 scala packrat 解析器组合器如下所示:

但这不起作用。要么它“匹配贪婪”并告诉我:

或者如果我将其更改|为 a|||我会得到一个 stackoverflow:

我有点理解为什么会出现错误;我能做些什么来解析像上面这样的语法?对我来说似乎并不深奥

编辑:基于http://scala-programming-language.1934581.n4.nabble.com/Packrat-parser-guidance-td1956908.html中引用的论文, 我发现我的程序实际上并没有使用新的 packrat 解析器。

IE。更改Parser[Any]PackratParser[Any]并使用lazy val而不是def

我将上面的内容重写为:

0 投票
2 回答
1390 浏览

scala - 用于嵌入在 html 或文本(如 php)中的语言的 Scala 解析器组合器

一段时间以来,我一直在使用 Scala 解析器组合器,并学习了一些方法,使其表现良好并使用内置函数完成我想要的大部分事情。

但是如何制作嵌入式语言(如 php 或 ruby​​ 的 erb)?在实际代码的嵌入之外,它要求空格不能被忽略。

我设法制作了一个简单的解析器,它将所有文本与给定的正则表达式匹配,但我正在寻找一种更好、更漂亮的方法来做到这一点。可能有一些已经定义的函数可以完成所需的工作。

测试语言解析如下文本:

并由以下代码生成: