问题标签 [fastparse]

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 投票
3 回答
520 浏览

scala - 如何使用 FastParse 精确匹配“n”个给定字符

FastParse parser -combinator scala 库为您提供了.rep(n)“重复”方法,以允许您创建一个新的解析器,该解析器尝试解析 givenParsern 或更多次。如果我想要完全 n匹配,那么规范的方法是什么?

在我的例子中,我想解析一个 40 个字符的 Git 提交 id - 如果它超过 40 个字符,那不是一个提交 id,它不应该是匹配的。

到目前为止,我在文档中找到的最接近的示例是:

...与简单重复的 4 个字符匹配(对于 40 个字符的提交 ID 是冗长的)。

这些是解析器组合器,而不是正则表达式,答案类似于\p{XDigit}{40}.

0 投票
2 回答
1316 浏览

scala - 为什么解析器组合器不回溯?

考虑

与 fastparse 相同的故事

解析器很高兴发现采用第一个文字是一个坏主意,但不要试图回退到求和生产。为什么?

我知道解析器采用第一个可以成功吃掉输入字符串的一部分并退出的分支。这里,表达式的“1”匹配第一个输入字符,解析完成。为了获取更多,我们需要将 sum 设为第一个选择。然而,愚蠢至极

惰性 val expr: Parser[String] = sum | “1”

以堆栈溢出结束。因此,图书馆作者从另一面接近它

在这里,我们从终端开始求和,这很好,但这种语法更冗长,此外,它产生一个终端,然后是一个列表,这对于一个归约运算符很有用,比如 sum,但很难映射到一个系列二元运算符。

如果您的语言定义了允许二元运算符的表达式怎么办?您想匹配每个出现的expr op expr并将其映射到相应的树节点

你是怎样做的?简而言之,我想要一个贪婪的解析器,它会消耗整个字符串。这就是我所说的“贪婪”而不是贪婪的算法,它跳进第一辆马车并最终陷入死胡同。

0 投票
2 回答
65 浏览

fastparse - P[Node].rep 产生 P[String] 而不是节点数组

我希望加号的结果是某种数组

但编译器说

类型不匹配; 发现:需要解析器 [字符串]:解析器 [列表 [加]]

0 投票
1 回答
229 浏览

scala - Scala FastParse 库错误

我正在尝试学习 scala 快速解析库。为此,我编写了以下代码

但我得到错误

我的预期输出是“Bar(10), Baz(20)”。上面的解析器似乎不喜欢结尾“)”。

0 投票
1 回答
206 浏览

scala - 快速解析。如何执行恰好一次规则

我正在尝试使用 FastParse API 实现以下语法。

  1. Expr 只能包含 Foo,Bar,Baz 子表达式
  2. Expr 必须包含至少 1 个子表达式 Foo/Bar/Bar。不能为空
  3. Foo/Bar/Baz 可以在 Expr 中以任意顺序出现。
  4. Foo/Bar/Baz 不能重复,因此您只能使用一次

所以一个有效的表达式是Expr(Baz(10),Foo(10),Bar(10)),无效的表达式是Expr()orExpr(Bar(10),Bar(10))

到目前为止,我已经编写了可以强制执行和解析 1、2、3 规则的代码。但事实证明,第 4 条规则很棘手。

0 投票
1 回答
105 浏览

scala - Fastparse 解析错误列号丢失

我刚刚从 fastparse 0.3.7 更新到 0.4.1。Parsed.Failure 的附加部分中不再有列编号值。我浏览了源代码,似乎该功能已被删除,尽管它仍在文档中。现在还有其他方法可以获取列信息吗?

0 投票
1 回答
337 浏览

scala - Fastparse 不会回溯

编辑(概括问题):

我想解析一个语法,在哪里

我希望(例如)以下单词通过:aaaaxxxbb, axxxaaxxxbbb,xxxxxxbb

原帖:

我希望以下解析器能够回溯并最终找到解决方案:

相反,看起来该before部分贪婪地解析了所有文本,并且解析器在没有回溯的情况下失败。

我错过了什么吗?

0 投票
1 回答
231 浏览

scala - 用类型别名描述递归语法

如何使用类型别名来描述这种递归语法:

就目前而言,Scala 编译器 (2.12.1) 给了我:

PS这里的上下文是用fastparse解析递归语法。


编辑(回应@OlivierBlanvillain 下面的回答)

这个答案真的很美,正是我在寻找的东西,我会记住它以备不时之需。

但是,由于其他原因,在这种特殊情况下,我不得不使用这些定义:


另请参阅: 从递归类型语法中实例化类型

0 投票
0 回答
215 浏览

scala - 用非转义字符解析字符串

我有一个支持某种自定义语言的库。解析器是使用 scala RegexParsers 编写的。现在我正在尝试使用 fastparse 库重写我们的解析器来加速我们的引擎。问题是:是否可以在我们的伪语言函数中正确解析参数?

这是一个例子:

这是一个带有 3 个参数的函数 doSomething:

  1. /mypath[text() != '']
  2. def f(a) {a * 2}
  3. ,

我期望用参数得到一个函数树:

我所做的:

这里的问题是单引号在我的代码中表示一个字符串,但在该字符串中有时我们有额外的单引号,如下所示:

/mypath[文本() != '' ]

所以,在我的情况下,我不能使用CharPred(_ != '\'')

我们在字符串中也有一个逗号,就像在第三个参数中一样

这是使用 scala 解析器以某种方式工作,但我无法使用 fastparse 解析相同

有谁知道如何使解析器正常工作?

更新

知道了!主要的魔法在val param

出去:

0 投票
1 回答
166 浏览

scala - FastParse - 内存不足错误

我正在尝试使用FastParse 库为非常原始的模板系统创建解析器,如下所示:

您好,您的名字是 {{name}},今天是 {{date}}。

到目前为止,我有:

但是当我尝试我认为应该是正确的最终形式时:

我得到:

我究竟做错了什么?