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

scala - 以 parboiled2 中的字符结尾的字符串,当字符串可以包含该字符时

我在编写 parboiled2 解析器时遇到了一个棘手的问题,即我需要匹配行的一部分,该行是一个字符串,其结尾由一个:字符标记。这很容易,除了字符串可以包含字符:

目前我有这个将字符串视为一组以冒号结尾的字符串并将它们连接起来,但这会消耗:我不想要的尾随,因为尾随:不是字符串本身的一部分。

我觉得我应该&(":")在这里的某个地方使用,但我在匹配插页式:字符的同时努力工作。

成功匹配示例(作为较长字符串的一部分):

  • localhost:->localhost
  • 1:::->1::
  • :::->::

不匹配:

  • :

任何建议都会受到欢迎,即使它是“你不能这样做”,所以我可以停止绞尽脑汁。


上下文是解析bindHAProxy 配置文件中的设置。给定以下(简化的)案例类的一些有效字符串示例是:

  • bind :80->Bind(Endpoint(None, Some(80)), Seq())
  • bind localhost:80->Bind(Endpoint(Some("localhost"), Some(80)), Seq())
  • bind localhost->Bind(Endpoint(Some("localhost"), None), Seq())
  • bind :80 param1->Bind(Endpoint(None, Some(80)), Seq("param1")))

换句话说,如果有一个字符串,它需要在 final 之前终止,:因为这表明存在端口。endpoint规则如下所示:

最终,端点的可匹配字符串由空格或行尾终止,因此一种选择是只捕获空格,然后单独解析字符串,但我希望在主解析器中完成。

0 投票
2 回答
430 浏览

scala - 如何使 parboiled2 匹配整个输入?

我编写了以下 hello-world parboiled2 解析器:

这主要按预期工作,例如它成功地将“1 + 2”解析为 3。

如果我给它输入无效的输入,例如“1 + (2”,我希望解析失败。但它实际上成功了,结果为 1。

看起来 parboiled2 只是解析输入的一部分,而忽略了它无法解析的其余部分。这是预期的行为吗?有没有办法强制解析器解析整个输入并在它不能这样做时失败?

0 投票
1 回答
188 浏览

scala - Parboiled2:引用来自 AST 的源文本中的位置

我正在写一个 DSL,同时也在学习 parboiled2。构建 AST 后,我想运行一些语义检查,如果有任何错误,输出引用源文本中违规位置的错误消息。

我正在写如下内容,到目前为止,这些内容确实有效:

有没有更好或更简单的方法?

0 投票
1 回答
132 浏览

shapeless - 了解 Parboiled2 的 '~' 组合器

查看parboiled2部分,Rule Combinators and Modifiers

在此处输入图像描述

我不明白a,b和 thena ~ b图表。

到目前为止,我发现文档很简单。但在这里有点迷路了。

你能解释一下每个块吗?

0 投票
1 回答
1032 浏览

scala - Parboiled2 Parser Example

I'm trying to try out this example from parboiled2:

Then, I create a new MyParser with input of "foo".

Yet the return value is null.

How can I run this simple f Rule from the REPL?

0 投票
1 回答
788 浏览

scala - Scala 中具有路径相关类型(解析器)的纯函数式编程?

因此,当使用 Scala 解析器时,可能会有:

Parser是依赖路径的类型,因此无法重构此代码,以便bars可以从构造函数传入。请注意,parserFromString在我的用例中,实际上创建 aMyParser的方式使得MyParser构造变为 O(N!) where N = foos.size

所以假设现在我希望bars通过另一个foo. FP 方法是重构以包含bars在构造函数中,然后定义类似的东西def +(foo: String): MyParser = copy(bars = bars :+ parserFromString(foo),但如前所述,我不能从头开始重新创建。

我的解决方案就是制作bars一个private var并用一种Unit方法对其进行变异update,即def update(foo: String): Unit = bars +:= parserFromString(foo)

我的第一个问题很简单:我被卡住了吗?我必须使用突变吗?

第二个问题:Parboiled2 会因此受苦吗?他们是否使用依赖于路径的类型(乍一看不像),如果是这样,为什么 Scala 解析器使用依赖于路径的类型?

如果 parboiled2 不受路径依赖类型的影响,仅此一项就可以成为使用它的理由!

如果有人想知道为什么我需要Parser从参数创建 s,那是因为我正在实现一种语言,用户可以在其中定义宏并使用这些宏来定义其他宏。所以不,在有人试图告诉我改变设计之前,我不能。我也真的不想要可变性,因为稍后我将需要多线程。

0 投票
1 回答
113 浏览

scala - parboiled2 Illegal rule composition

I am writing an cron parser, but compiler complains illegal rule composition,

What's wrong with my parser?

0 投票
0 回答
147 浏览

scala - Parboiled2 PopRule 示例

在阅读了https://github.com/sirthias/parboiled2上的文档后,我发现我可以使用以下规则从堆栈中弹出一些东西:

但是当 L 不是字符串时,我找不到此类规则的工作示例。

例如,假设我有以下规则:

为了证明这一点,有一个 parboiled2 规则的一般定义:

它代表一个规则,从堆栈中弹出 I 中的值并将 O 中的值放入堆栈。

到目前为止,我想不出以下规则类型的示例实现:

0 投票
1 回答
294 浏览

scala - Parboiled2 语法用于解析转义的 CSV 行

我正在尝试将包含由分隔符分隔的字符串的单行解析为这些字符串的序列。它应该能够在字符串中包含任何字符,如果字段包含分隔符,则需要在其周围加上双引号。为了在这样的字段中使用双引号,双引号由 . 转义。

我以此为起点:https ://github.com/sirthias/parboiled2/blob/695ee6603359cfcb97734edf6dd1d27383c48727/examples/src/main/scala/org/parboiled2/examples/CsvParser.scala

我的语法如下所示:

当我打电话给"quote\"key",1,2 我时Invalid input 'k', expected whiteSpace, ',' or 'EOI' (line 1, column 9)

我究竟做错了什么?我将如何调试这个?(作为一个额外的问题:我将如何扩展语法以允许分隔符成为多个字符,例如##?)

谢谢!

0 投票
1 回答
252 浏览

scala - 动态创建 parboiled2 规则

我可以在 parboiled2 解析器中动态生成规则吗?用例是我已经定义了一堆规则,但是想添加更多而不是每次添加规则时都编译。