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

scala - 如何在不丢剑的情况下从文本中解析占位符,这样你就可以用灯罩击退掠夺者

我需要从文本中解析占位符,例如abc $$FOO$$ cba. 我用 Scala 的解析器组合器破解了一些东西,但我对这个解决方案并不满意。

特别是,我在正则表达式中使用了零宽度匹配器(?=(\$\$|\z))来停止解析文本并开始解析占位符。这听起来非常接近于在scala 邮件列表中讨论的恶作剧和色彩缤纷的恶作剧(这激发了这个问题的标题。)

所以,挑战:修复我的解析器在没有这个黑客的情况下工作。我希望看到从问题到您的解决方案的清晰进展,因此我可以替换随机组装组合器直到测试通过的策略。

0 投票
2 回答
303 浏览

scala - 方法“|”中的预期解析器类型

我针对 scala 2.8.0 编译了以下代码:

编译 MyParser1 给出:

我相信它失败是因为 | 方法类型签名,定义为:

为什么 U 必须是 T 的超类型?“primitiveType”的返回值应该是什么?

0 投票
1 回答
357 浏览

scala - 将标签附加到 Scala 中的不可变案例类

我正在尝试使用包括标签和 goto 在内的命令为小语言创建解析器:

GOTO等是扩展抽象类的IFCMD案例类Core

为了与功能/类似scala/不可变对象的方式保持一致,我认为这样定义Core错误的:

但可以让我用以下内容替换部分<APPENDLABELTO_CORE>

谁能指出“scalaish”的方式来做到这一点?

(我试过c copy (label=Some(l))了,但抽象基类没有自动复制构造函数的魔力)

0 投票
4 回答
4157 浏览

parsing - 如何为统一的差异语法编写解析器

我应该使用 RegexParsers、StandardTokenParsers 还是这些都适合解析这种语法?可以从这里找到语法示例。

0 投票
1 回答
1170 浏览

regex - 使用 RegexParsers 解析空白/空格

解析空白/空白有什么问题?

0 投票
1 回答
1841 浏览

regex - 如何编写一个匹配所有不是“$”后跟“i”或“{”的字符的正则表达式?

意思是,我想匹配:

或者

但不是这个:

或者:

我还想匹配其他所有内容……普通字符、符号、数字等。

匹配除以 $ 开头的所有内容之外的所有内容都很容易。就像这样:

我已经尝试过使用 (?!i) 或 (?!{) 多种组合的正则表达式前瞻语法,但我似乎无法让它工作。我也试过用 = 而不是 ! 像这样: (?=i)

基本上,我已经尝试以我可以用 [^\$] 表达式成像的各种方式注入这些前瞻,但我无法让它工作。

帮助?

编辑:Hrm,这似乎有效:

0 投票
1 回答
377 浏览

f# - 这是解析器组合库的合理基础吗?

我最近一直在使用 FParsec,我发现缺乏通用解析器对我来说是一个主要的停止点。我对这个小库的目标是简单性以及对通用输入的支持。你能想到任何可以改善这一点或有什么特别糟糕的补充吗?

回溯

令人惊讶的是,实现您所描述的内容并不需要太多代码。这有点草率,但似乎工作得很好。

回溯第 2 部分

切换代码以使用惰性列表和尾调用优化递归。

0 投票
4 回答
2746 浏览

parsing - Scala 解析器:可用性、差异和组合?

我的问题是关于 Scala 解析器:

  • 哪些是可用的(在标准库和外部),
  • 它们之间有什么区别,
  • 他们是否共享一个通用的 API 和
  • 可以组合不同的解析器来解析一个输入字符串吗?

我至少找到了这些:

  • Scala 的“标准”解析器(似乎是 LL 解析器)
  • Scala 的Packrat 解析器(从 2.8 开始,是一个 LALR 解析器)
  • Parboiled解析器(PEG 解析器?)
  • Spiewak 的GLL 解析器组合器
0 投票
4 回答
8015 浏览

haskell - 解析器组合器能否变得高效?

大约 6 年前,我在 OCaml 中对自己的解析器组合器进行了基准测试,发现它们比当时提供的解析器生成器慢约 5 倍。我最近重新审视了这个主题,并将 Haskell 的 Parsec 与用 F# 编写的简单的手动优先爬升解析器进行了基准测试,并惊讶地发现 F# 比 Haskell 快 25 倍。

这是我用来从文件中读取大型数学表达式、解析和评估它的 Haskell 代码:

这是我在 F# 中的自包含优先级攀爬解析器:

我的印象是,即使是最先进的解析器组合器也会浪费大量时间进行回溯。那是对的吗?如果是这样,是否可以编写生成状态机的解析器组合器以获得具有竞争力的性能,或者是否有必要使用代码生成?

编辑:

这是我用来生成 ~2Mb 表达式以进行基准测试的 OCaml 脚本:

0 投票
2 回答
164 浏览

java - 关于Java语法中修饰符的问题

Java语法定义ModifiersOpt: { Modifier }. Modifier被定义为public, protected, private, staticetc ...之一。{x}表示 . 的零次或多次出现x

我们知道这public public不是一个有效的标识符。这是否意味着列表中的任何元素(Modifier例如public只出现一次{Modifier}?是否有任何“标准”解析器组合器{ Modifier }