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

scala - Scala 解析器组合器:如何反转匹配?

是否可以使用 Scala 解析器组合器反转匹配?我正在尝试使用以一组关键字开头的解析器匹配行。我可以使用烦人的零宽度负前瞻正则表达式(例如"(?!h1|h2).*")来做到这一点,但我宁愿使用 Scala 解析器来做到这一点。我能想到的最好的是:

这个想法是我用的~!禁止回溯到所有匹配的正则表达式,然后继续使用不匹配的正则表达式 "(?=a)b".r。(顺便说一句,是否有一个总是失败的预定义解析器?)这样,如果找到关键字,则不会匹配该行,但如果关键字不匹配,则会匹配该行。

我想知道是否有更好的方法来做到这一点。有没有?

0 投票
1 回答
747 浏览

scala - Scala解析器组合器,大文件问题

我编写了一个解析器,如下所示:

如果我使用 FileReader 从(270MB)文件中解析如下:

我得到一个Exception in thread "main" java.lang.StackOverflowError(我也尝试过包装在 a 中BufferedReader),但我可以通过首先将文件读入 String 来修复它,如下所示:

为什么会这样?有什么办法可以避免先将它作为字符串读取,这似乎是一种浪费?

0 投票
1 回答
4182 浏览

scala - Scala 解析器组合器和换行符分隔的文本

我正在编写一个 Scala 解析器组合器语法,它读取换行符分隔的单词列表,其中列表由一个或多个空行分隔。给定以下字符串:

我想让它返回List(List(cat, mouse, horse), List(apple, orange, pear))

我编写了这个基本语法,它将单词列表视为换行符分隔的单词。请注意,我必须覆盖whitespace.

这错误地将空行视为空单词列表,即它返回

(注意中间的空列表。)

我可以在每个列表的末尾放置一个可选的行尾。

这可以处理列表之间只有一个空行的情况,但是对于多个空行有同样的问题。

我尝试更改lists定义以允许多个行尾分隔符:

但这取决于上述输入。

将多个空行作为分隔符处理的正确语法是什么?

0 投票
2 回答
1215 浏览

parsing - 使用 scala 解析器组合器解析基于缩进的语言

有没有一种方便的方法可以使用 Scala 的解析器组合器来解析缩进很重要的语言?(例如 Python)

0 投票
2 回答
144 浏览

scala - Scala 2.9:解析器子类不识别“Elem”覆盖?

我写了一个解析器来充当词法分析器。这个词法分析器解析一个文件并返回一个标记列表,每个标记都是一个扩展公共特征的案例类或对象。

我现在正在尝试为词法分析器的输出编写一个解析器,但我遇到了一个非常令人困惑的问题。解析器很乐意隐式转换我的案例对象,但如果我什至尝试apply(classHere)手动调用,它就会抛出一个合适的。

以下是我的代码的简化版本:

编译器报告以下有关的消息doesNotWork

我怎样才能解决这个问题?

0 投票
1 回答
221 浏览

parsing - 如何限制单子转换器解析器组合器中的回溯

tl; dr,我如何实现可以限制回溯的解析器,其中解析器是单子转换器堆栈?

我还没有找到这种方法的任何论文、博客或示例实现;似乎限制回溯的典型方法是具有附加构造函数的数据类型,或者默认情况下关闭回溯的 Parsec 方法。

我目前的实现——使用commit组合器,见下文——是错误的;我不确定类型,它是否属于类型类,而且我的实例不像它们应该的那样通用。

谁能描述如何干净地做到这一点,或指出我的资源?

我在下面添加了我当前的代码;抱歉帖子这么长!


堆栈:

目的是回溯在中间层运行——一个Nothing或一个空列表不一定会产生错误,它只是意味着应该尝试不同的分支——而底层是错误的(有一些上下文信息)立即中止解析。

几个解析类:

他们的例子:

还有几个组合器:

然后这些解析器:

给出这些结果:

0 投票
3 回答
1044 浏览

scala - 如何测试Scala组合解析器是否匹配字符串

我有一个处理逗号分隔的十进制数列表的 Scala 组合器解析器。

当给定与模式匹配的字符串时,该itMatches函数返回。true例如:

有没有更简洁的方法来做到这一点?我在文档中找不到,但我的函数看起来有点冗长,所以我想知道我是否忽略了一些东西。

0 投票
1 回答
146 浏览

scala - 使用 Scala Combinator Parsers 区分整数和浮点数

我一直在让 scala 组合器解析器(特别是通过 JavaTokenParsers 的 RegexParsers)在整数和浮点数之间做出决定时遇到问题。我必须在这里遗漏一些非常基本的东西,因为我似乎无法在任何地方找到任何提及这个特定问题的内容。我已经在有问题的解析器代码中包含了一个规范(当然,减去了)。

这失败并显示以下错误消息:

一个想法是,基于这个线程,我<~ not(not('.'))在整数之后放置了一个,但这似乎并没有解决问题。

0 投票
1 回答
726 浏览

parsing - 在 scala 中使用解析器组合器创建递归数据结构

我是 scala 的初学者,在S99上工作以尝试学习 scala。其中一个问题涉及从字符串转换为树数据结构。我可以“手动”完成它,我还想看看如何使用 Scala 的解析器组合器库来完成它。

树的数据结构是

输入应该是一个字符串,如下所示:a(b(d,e),c(,f(g,)))

我可以使用类似的东西解析字符串

但是如何使用解析库来构建树呢?我知道我可以用它^^来将一些字符串转换为整数。我的困惑来自于在创建Node. 我该怎么做,或者这是否表明我想做一些不同的事情?

我最好采用解析器返回的东西((((((a~()~(((((b~()~d)~,)~e)~)))~,)~(((((c~()~)~,)~(((((f~()~g)~,)~)~)))~)))~))对于上面的示例输入),并基于它构建树,而不是使用解析器运算符^^^^^直接构建树?

0 投票
5 回答
4009 浏览

c - C中解析器组合器的更好方法?

我正在尝试从头开始引导(一个子集)C,而不使用额外的依赖项(解析器生成器、库等)。我还想利用解析器组合器的想法,这是函数式编程中的一项绝妙技术。我想以简洁实用的方式将函数世界中的这个想法借用到程序 C 中。

我尝试为以下玩具语法实现一些必要的解析器组合器,这也是Simon Peyton Jones的《实现功能语言 - 教程》一书中的一个示例。

person任何以字母开头的标记在哪里。例如,令牌列表

被解析成

(这本书使用 Haskell,很难让它与语言无关,但你明白了 :-)

我用 C 实现了这个,你可以在这里查看代码:https ://gist.github.com/4451478

这个实现需要 200 多行 C 代码,这远远超过了书中所写的大约 20 行 Haskell 代码。所以我不确定我是否在 C 中做解析器组合器的正确轨道,以及是否有任何可能的改进。欢迎任何建议。提前致谢。