问题标签 [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.
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:
scala - 在 parboiled2 中工作
这看起来很简单!
我尝试:
但我得到:
我希望 Vector 有两个单独的元素:piped1
和piped2
.
我犯了什么愚蠢的错误?
scala - 将 Seq[Any] 分解为案例类的巧妙方法
我一直在解析具有部分的专有文件格式,每个部分都有许多记录。部分可以按任何顺序排列,记录可以按任何顺序排列。顺序并不重要。虽然部分不应重复,但我不能保证。
我一直在使用 parboiled2 使用如下格式生成 AST:
每个部分都生成一个案例类。他们不会继承任何导致Seq[Any]
这些部分案例类还包含Seq[T]
特定于部分类型的记录。
我想把它Seq[Any]
变成一个
是否有人对此有聪明且易于阅读的技术,或者我应该制作一些可变集合并使用带有匹配的 foreach ?
当我回到使用 vars 的 foreach 时,我总是觉得我错过了一些 Scala 魔法。
编辑1:有人提出我应该扩展一个公共基类,我确实可以。match
但是如果我仍然必须使用来识别类型,我看不出解决方案有什么变化。我想分离出不同的案例类类型,例如下面我想将所有的B
's, C
' E
s 和F
's 一起收集到一个Seq[B]
, Seq[C]
,Seq[E]
和Seq[F]
编辑 2:折叠解决方案
编辑 3:穷举
scala - parboiled2 解析器提取标记和固定文本
需要提取标记和固定文本。例子:
“你好 {token1} 今天的日期是 {token2} 你想打电话给 {token3}”
会回来FixedPart("Hello ")
TokenPart(token1)
FixedPart(" today's date is ")
TokenPart(token2)
FixedPart(" would you like to call ")
TokenPart(token3)
这是天真的实现
还有其他实现吗?
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
只是作为一个例子。我在这里根本不问细节;我要问的是如何从一开始就解决这个问题。
我至少看到了两种或三种方法。
- 保持现有
CommandParser
状态不变,并为每个命令语法排列编写特定于命令的解析器 - 为每个命令保留现有但编写特定于命令的、语法中立的解析器,以便可以使用任何语法,只要它被全面使用(但我该怎么做呢?)
- 编写
CommandParser
每个语法。
CurrentCommandParser
主要是从其他开源“启发”而来的:
所以我在想,也许我应该扩展CommandParser
或只是增加我的能力
scala - 在 parboiled2 中,我应该如何在解析器操作中报告错误?
在 parboiled2 中报告解析器操作错误的最佳方法是什么(我使用的是 v 2.1.4)?
例如,假设我想读取一个整数值并在它不在预期范围内时报告错误?我尝试调用fail
,但这在解析器操作中似乎无效。另外,我不知道应该如何为test
规则提供堆栈值。我只是抛出一个ParseError
异常吗?
更具体一点,请考虑以下规则:
scala - Parboiled2:如何处理依赖字段?
我正在尝试使用出色的parboiled2库解析文件格式,其中某些字段的存在取决于已处理的一个或多个字段的值。
例如,假设我有两个字段,其中第一个是指示第二个是否存在的标志。也就是说,如果第一个字段是true
,那么第二个字段(在这个例子中是一个整数值)存在并且必须被处理 - 但如果它是false
,那么第二个字段根本不存在。请注意,第二个字段不是可选的- 它要么必须被处理(如果第一个字段是true
),要么不能被处理(如果第一个字段是false
)。
因此,如果第三个字段(我们假设它始终存在)是带引号的字符串,则以下两行都有效:
但这将是无效的:
忽略第三个字段,如何编写规则来解析前两个?(我无法从文档中看出,到目前为止谷歌搜索也没有帮助......)
更新:我应该澄清我不能使用如下规则,因为我正在解析的格式实际上比我的示例复杂得多:
更新 2:我修改了以下内容以使我的意图更清晰:
我正在寻找的是与以下(不存在的)规则等效的有效规则,该规则仅在满足条件时才执行匹配:
也就是说,仅当结果为值ws ~ intField
时才匹配。这样的事情可能吗?boolField
true