问题标签 [parboiled2]

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

scala - Running a parser within parboiled2

The docs for parboiled2 mention the following to get results:

https://github.com/sirthias/parboiled2#access-to-parser-results

However I get a compilation error when attemping what seems to that approach:

Here is the outline of the parser:

The code to attempt to run it

But the "run" is not accepted:

0 投票
0 回答
72 浏览

scala - 在 parboiled2 中工作

这看起来很简单!

我尝试:

但我得到:

我希望 Vector 有两个单独的元素:piped1piped2.

我犯了什么愚蠢的错误?

0 投票
1 回答
683 浏览

scala - 将 Seq[Any] 分解为案例类的巧妙方法

我一直在解析具有部分的专有文件格式,每个部分都有许多记录。部分可以按任何顺序排列,记录可以按任何顺序排列。顺序并不重要。虽然部分不应重复,但我不能保证。

我一直在使用 parboiled2 使用如下格式生成 AST:

每个部分都生成一个案例类。他们不会继承任何导致Seq[Any]

这些部分案例类还包含Seq[T]特定于部分类型的记录。

我想把它Seq[Any]变成一个

是否有人对此有聪明且易于阅读的技术,或者我应该制作一些可变集合并使用带有匹配的 foreach ?

当我回到使用 vars 的 foreach 时,我总是觉得我错过了一些 Scala 魔法。

编辑1:有人提出我应该扩展一个公共基类,我确实可以。match但是如果我仍然必须使用来识别类型,我看不出解决方案有什么变化。我想分离出不同的案例类类型,例如下面我想将所有的B's, C' Es 和F's 一起收集到一个Seq[B], Seq[C],Seq[E]Seq[F]

编辑 2:折叠解决方案

编辑 3:穷举

0 投票
1 回答
230 浏览

scala - parboiled2 解析器提取标记和固定文本

需要提取标记和固定文本。例子:

“你好 {token1} 今天的日期是 {token2} 你想打电话给 {token3}”

会回来

  • FixedPart("Hello ")
  • TokenPart(token1)
  • FixedPart(" today's date is ")
  • TokenPart(token2)
  • FixedPart(" would you like to call ")
  • TokenPart(token3)

这是天真的实现

还有其他实现吗?

0 投票
0 回答
36 浏览

scala - parboiled2 中是否有一种方法可以进行子类化,以便您可以接受多种语法(PowerShell 样式、bash/sh 样式、Cisco 样式)?

警告我是新手parboiled2

我希望能够以某种与所涉及的语法无关的方式编写我的 CLI。它将始终具有相同的形状,三元组:

我想更进一步,也许是子类这个或子类它的解析器,或者以其他方式扩展以实现具有以下功能的能力:

接受以下任何一项:

  • Create-Dog -Feet 4 -Name Fido -Walks Daily /Home/Dogs
  • create_dog -f 4 --name Fido ~/Dogs
  • Dog.Create Feet=4, Name=Fido, Walks=Daily in /Home/Dogs

只是作为一个例子。我在这里根本不问细节;我要问的是如何从一开始就解决这个问题。

我至少看到了两种或三种方法。

  1. 保持现有CommandParser状态不变,并为每个命令语法排列编写特定于命令的解析器
  2. 为每个命令保留现有但编写特定于命令的、语法中立的解析器,以便可以使用任何语法,只要它被全面使用(但我该怎么做呢?)
  3. 编写CommandParser每个语法。

CurrentCommandParser主要是从其他开源“启发”而来的:

所以我在想,也许我应该扩展CommandParser或只是增加我的能力

0 投票
1 回答
74 浏览

scala - 在 parboiled2 中,我应该如何在解析器操作中报告错误?

在 parboiled2 中报告解析器操作错误的最佳方法是什么(我使用的是 v 2.1.4)?

例如,假设我想读取一个整数值并在它不在预期范围内时报告错误?我尝试调用fail,但这在解析器操作中似乎无效。另外,我不知道应该如何为test规则提供堆栈值。我只是抛出一个ParseError异常吗?

更具体一点,请考虑以下规则:

0 投票
2 回答
129 浏览

scala - Parboiled2:如何处理依赖字段?

我正在尝试使用出色的parboiled2库解析文件格式,其中某些字段的存在取决于已处理的一个或多个字段的值。

例如,假设我有两个字段,其中第一个是指示第二个是否存在的标志。也就是说,如果第一个字段是true,那么第二个字段(在这个例子中是一个整数值)存在并且必须被处理 - 但如果它是false,那么第二个字段根本不存在。请注意,第二个字段不是可选的- 它要么必须被处理(如果第一个字段是true),要么不能被处理(如果第一个字段是false)。

因此,如果第三个字段(我们假设它始终存在)是带引号的字符串,则以下两行都有效:

但这将是无效的:

忽略第三个字段,如何编写规则来解析前两个?(我无法从文档中看出,到目前为止谷歌搜索也没有帮助......)

更新:我应该澄清我不能使用如下规则,因为我正在解析的格式实际上比我的示例复杂得多:

更新 2:我修改了以下内容以使我的意图更清晰:

我正在寻找的是与以下(不存在的)规则等效的有效规则,该规则仅在满足条件时才执行匹配:

也就是说,仅当结果为值ws ~ intField时才匹配。这样的事情可能吗?boolFieldtrue