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

parsing - 不区分大小写的 Scala 解析器组合器

我正在尝试创建一种语言,其中的某些部分我希望不区分大小写。我敢肯定这很容易,但我一直找不到。

编辑:重读让我为这个问题感到羞耻。是一个失败的测试,它解释了我的意思。

0 投票
2 回答
1491 浏览

scala - Scala,树结构数据的解析器组合器

解析器如何用于解析跨越多行的记录?我需要解析树数据(并最终将其转换为树数据结构)。我在下面的代码中遇到了一个难以跟踪的解析错误,但不清楚这是否是 Scala 解析器的最佳方法。问题实际上更多是关于解决问题的方法,而不是调试现有代码。

EBNF-ish 语法是:

尝试实现和测试语法:

0 投票
3 回答
700 浏览

parsing - Scala Parser - 消息长度

我在玩 Scala 的 Parser 库。我正在尝试为指定长度后跟该长度消息的格式编写解析器。例如:

我不确定如何使用组合器来做到这一点。我首先想到的是:

但显然身体取决于长度,我不知道该怎么做:p

相反,您可以将消息解析器定义为单个解析器(而不是解析器的组合),我认为这是可行的(尽管我没有查看单个解析器是否可以拉多个 elem?)。

无论如何,我是一个 scala 菜鸟,我只是觉得这太棒了:)

0 投票
2 回答
1283 浏览

parsing - Scala解析器组合器,解析器由于优先级而失败

我正在尝试为编程语言 Icon 编写解释器。此过程中的步骤之一是为 Icon 编写解析器,我已通过以下方式完成:

但是,当我尝试解析以下表达式时遇到了一些问题:

我收到此错误:

而解析

工作得很好。如果我将 orexp 解析器移动到 fromto 解析器上方的 exp 组,则第一个表达式可以正常工作。但是,这不符合 Icon 给出的规则,也没有解决根本问题。

有人对解决方案有任何想法吗?根据 Scala 文档,混合使用 Packrat 解析器和常规解析器应该没问题。

0 投票
1 回答
973 浏览

scala - DSL实现REST服务路由和处理的业务规则

我希望Combinator parsers( http://debasishg.blogspot.com/2008/04/external-dsls-made-easy-with-scala.html ) 能够用于处理 REST 服务的路由规则的设计用Scalatra( http://tutorialbin.com/tutorials/80408/infoq-scalatra-a-sinatra-like-web-framework-for-scala ) 实现。

此 REST 服务将用作代理,因此外部应用程序可以访问防火墙内的服务,因为它将具有额外的安全层,可以针对每个 REST 服务的业务需求进行定制。

因此,如果一个人想要访问他们的课程表,那么安全性将低于您想要查看某人的成绩单。

我想要关于去哪里实际获取信息的规则,以及如何返回它,以及在 DSL 中需要什么安全性。

但是,第一个问题是如何基于 DSL 动态更改 REST 服务的路由规则,因为我正在尝试创建一个不需要大量重新编译来添加新规则的框架,只需编写适当的脚本,让它被处理。

那么,是否可以使用 Scala 中的 Combinator Parser 实现 DSL,这将允许 JAX-RS(http://download.oracle.com/javaee/6/tutorial/doc/giepu.html)动态更改路由?

更新:

我还没有设计语言,但这是我想要做的:

这是两种可能的想法,其中将请求脚本的规则发送到不同的站点,例如在防火墙内,然后对数据进行加密并返回。

第二个会更复杂,因为将组合 SOAP 和两个 REST 请求的结果,并且需要额外的命令来说明如何组合,但想法是将所有这些放在可以解析的文件中在飞行中。

如果我使用 Groovy,那么可以为路由生成一些新类,这将消除一些性能损失,但我认为使用 Scala 将是最好的选择,即使我受到了性能损失。

我希望创建一个更易于维护的框架,这样新的路由规则就可以由不了解任何 OOP 或函数式语言的人编写,但可以使用Specs( http://code.google.com/p ) 编写规范/specs/ ) 以便功能方面可以确定他们的要求会定期进行测试。

更新 2:

当我开始进行设计时,我可能会直观地理解一些选项,但不知道为什么。今天我意识到 Groovy 可能是一个更好的解决方案的原因是我可以使用元编程(http://www.justinspradlin.com/programming/groovy-metaprogramming-adding-behavior- )生成路由类dynamic/ ),那么我就可以使用 Scala 或 Groovy 来动态使用生成的路由。如果它们尚不存在,我不确定如何让 Scala 生成这些类。

在 Groovy 以及其他一些语言中,如此处所示 ( http://langexplr.blogspot.com/2008/02/handling-call-to-missing-method-in.html ) 如果缺少方法,您可以动态生成该方法,它将从此存在,因此它将丢失一次。

似乎我应该将 Groovy 与 Java 混合来完成这项工作,但结果可能是一些代码在 Scala 中,一些在 Java 中,用于路由 REST 服务。

0 投票
1 回答
473 浏览

scala - 如何使用解析器组合器进行条件检查

我正在尝试编写一个简单的 html 模板引擎(为了好玩),并想解析这样的结构

A. 普通行是 HTML

B. 如果一行以开头,$则将其视为 java 代码行

C.如果${}换行多行,里面的所有代码都应该是java代码。

D.如果一行以$include然后在行上做一些技巧(调用另一个模板)

这将创建一个新的实例anotherTemplate,并调用它的render()方法

E. 并且除了 之外会有更多的“命令” $include,例如$def, $val

如何在解析器组合器中表达这一点?实际上它是一个条件分叉

对于 1. 和 2.,我得到了这样的结果:

whereupto是从 Scalate Scamel 解析器中借来的(我刚刚开始阅读并且不太明白)

我曾经not('{')$....代码行与${...}块区分开来。但这很麻烦,并且不会扩展到其他“命令”

那么我该怎么做呢?

0 投票
1 回答
595 浏览

unit-testing - 对 Scala Lexer 进行单元测试

我正在开发一个使用 Scala 解析器组合器编写的解释器。我的解释器将词法分析和解析分为两个阶段。我想为我的词法分析器编写单元测试,以确保它产生正确的输出。

现在,我正在使用帮助方法方法进行单元测试,我在下面提供了该方法。该方法将程序的源代码作为参数,并返回一个 Token 对象列表。使用单元测试框架 (ScalaTest),我可以对生成的令牌列表进行模式匹配。

当前方法存在的问题:

  1. 它需要我的词法分析器中的辅助方法来帮助单元测试
  2. 它使用一个while循环
  3. 它诉诸于手动构建和使用扫描仪

似乎应该有更好的方法将程序的源代码转换为令牌列表。

我当前的工作版本(至少相关部分):

0 投票
1 回答
753 浏览

parsing - 如何使用 Scala Parser Combinators 更改代码以考虑运算符优先级?

考虑这部分语法:

是否有必要重写它的一部分来创建新规则,或者是否只有一种方法(比如|vs. |||for first vs.longest rule matching)我目前缺少哪个做必要的事情?

0 投票
1 回答
243 浏览

scala - 使用解析器组合器列出相等性

我从这里获取了一些 Scala CSV 解析代码:

使用 Scala 解析器组合器解析 CSV 文件

然后我尝试为它编写一个基本测试:

这失败了,并带有消息:

java.lang.AssertionError:预期:scala.collection.immutable.$colon$colon 但是:scala.collection.immutable.$colon$colon

有任何想法吗?CSV.parse 的输出是一个空 List[List[String]] 但似乎与 List(Nil) 或 ListList[String] 等具有不同的 hashCode。我似乎找不到任何方法来组成一个列表等于 CSV.parse("") 的输出。

更新:

这是使用 REPL 的失败:

0 投票
3 回答
10791 浏览

scala - 理解 Scala 解析器组合器中的波浪号

我对 Scala 相当陌生,在阅读解析器组合器(解析器组合器背后的魔力Scala 中的域特定语言)时,我遇到了这样的方法定义:

我一直在阅读 scala.util.parsing.Parsers 的 API 文档,它定义了一个名为 (tilde) 的方法,但我仍然不太了解上面示例中的用法。在该示例中(波浪号)是一个在 java.lang.String 上调用的方法,它没有该方法并导致编译器失败。我知道(波浪号)被定义为

但这对上面的例子有什么帮助?

如果有人可以给我一个提示以了解这里发生了什么,我会很高兴。非常感谢您!