问题标签 [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.
scala - Scala 解析器组合器:如何反转匹配?
是否可以使用 Scala 解析器组合器反转匹配?我正在尝试使用不以一组关键字开头的解析器匹配行。我可以使用烦人的零宽度负前瞻正则表达式(例如"(?!h1|h2).*"
)来做到这一点,但我宁愿使用 Scala 解析器来做到这一点。我能想到的最好的是:
这个想法是我用的~!禁止回溯到所有匹配的正则表达式,然后继续使用不匹配的正则表达式 "(?=a)b".r。(顺便说一句,是否有一个总是失败的预定义解析器?)这样,如果找到关键字,则不会匹配该行,但如果关键字不匹配,则会匹配该行。
我想知道是否有更好的方法来做到这一点。有没有?
scala - Scala解析器组合器,大文件问题
我编写了一个解析器,如下所示:
如果我使用 FileReader 从(270MB)文件中解析如下:
我得到一个Exception in thread "main" java.lang.StackOverflowError
(我也尝试过包装在 a 中BufferedReader
),但我可以通过首先将文件读入 String 来修复它,如下所示:
为什么会这样?有什么办法可以避免先将它作为字符串读取,这似乎是一种浪费?
scala - Scala 解析器组合器和换行符分隔的文本
我正在编写一个 Scala 解析器组合器语法,它读取换行符分隔的单词列表,其中列表由一个或多个空行分隔。给定以下字符串:
我想让它返回List(List(cat, mouse, horse), List(apple, orange, pear))
。
我编写了这个基本语法,它将单词列表视为换行符分隔的单词。请注意,我必须覆盖whitespace
.
这错误地将空行视为空单词列表,即它返回
(注意中间的空列表。)
我可以在每个列表的末尾放置一个可选的行尾。
这可以处理列表之间只有一个空行的情况,但是对于多个空行有同样的问题。
我尝试更改lists
定义以允许多个行尾分隔符:
但这取决于上述输入。
将多个空行作为分隔符处理的正确语法是什么?
parsing - 使用 scala 解析器组合器解析基于缩进的语言
有没有一种方便的方法可以使用 Scala 的解析器组合器来解析缩进很重要的语言?(例如 Python)
scala - Scala 2.9:解析器子类不识别“Elem”覆盖?
我写了一个解析器来充当词法分析器。这个词法分析器解析一个文件并返回一个标记列表,每个标记都是一个扩展公共特征的案例类或对象。
我现在正在尝试为词法分析器的输出编写一个解析器,但我遇到了一个非常令人困惑的问题。解析器很乐意隐式转换我的案例对象,但如果我什至尝试apply(classHere)
手动调用,它就会抛出一个合适的。
以下是我的代码的简化版本:
编译器报告以下有关的消息doesNotWork
:
我怎样才能解决这个问题?
parsing - 如何限制单子转换器解析器组合器中的回溯
tl; dr,我如何实现可以限制回溯的解析器,其中解析器是单子转换器堆栈?
我还没有找到这种方法的任何论文、博客或示例实现;似乎限制回溯的典型方法是具有附加构造函数的数据类型,或者默认情况下关闭回溯的 Parsec 方法。
我目前的实现——使用commit
组合器,见下文——是错误的;我不确定类型,它是否属于类型类,而且我的实例不像它们应该的那样通用。
谁能描述如何干净地做到这一点,或指出我的资源?
我在下面添加了我当前的代码;抱歉帖子这么长!
堆栈:
目的是回溯在中间层运行——一个Nothing
或一个空列表不一定会产生错误,它只是意味着应该尝试不同的分支——而底层是错误的(有一些上下文信息)立即中止解析。
几个解析类:
他们的例子:
还有几个组合器:
然后这些解析器:
给出这些结果:
scala - 如何测试Scala组合解析器是否匹配字符串
我有一个处理逗号分隔的十进制数列表的 Scala 组合器解析器。
当给定与模式匹配的字符串时,该itMatches
函数返回。true
例如:
有没有更简洁的方法来做到这一点?我在文档中找不到,但我的函数看起来有点冗长,所以我想知道我是否忽略了一些东西。
scala - 使用 Scala Combinator Parsers 区分整数和浮点数
我一直在让 scala 组合器解析器(特别是通过 JavaTokenParsers 的 RegexParsers)在整数和浮点数之间做出决定时遇到问题。我必须在这里遗漏一些非常基本的东西,因为我似乎无法在任何地方找到任何提及这个特定问题的内容。我已经在有问题的解析器代码中包含了一个规范(当然,减去了)。
这失败并显示以下错误消息:
一个想法是,基于这个线程,我<~ not(not('.'))
在整数之后放置了一个,但这似乎并没有解决问题。
parsing - 在 scala 中使用解析器组合器创建递归数据结构
我是 scala 的初学者,在S99上工作以尝试学习 scala。其中一个问题涉及从字符串转换为树数据结构。我可以“手动”完成它,我还想看看如何使用 Scala 的解析器组合器库来完成它。
树的数据结构是
输入应该是一个字符串,如下所示:a(b(d,e),c(,f(g,)))
我可以使用类似的东西解析字符串
但是如何使用解析库来构建树呢?我知道我可以用它^^
来将一些字符串转换为整数。我的困惑来自于在创建Node
. 我该怎么做,或者这是否表明我想做一些不同的事情?
我最好采用解析器返回的东西((((((a~()~(((((b~()~d)~,)~e)~)))~,)~(((((c~()~)~,)~(((((f~()~g)~,)~)~)))~)))~))
对于上面的示例输入),并基于它构建树,而不是使用解析器运算符^^
或^^^
直接构建树?
c - C中解析器组合器的更好方法?
我正在尝试从头开始引导(一个子集)C,而不使用额外的依赖项(解析器生成器、库等)。我还想利用解析器组合器的想法,这是函数式编程中的一项绝妙技术。我想以简洁实用的方式将函数世界中的这个想法借用到程序 C 中。
我尝试为以下玩具语法实现一些必要的解析器组合器,这也是Simon Peyton Jones的《实现功能语言 - 教程》一书中的一个示例。
person
任何以字母开头的标记在哪里。例如,令牌列表
被解析成
(这本书使用 Haskell,很难让它与语言无关,但你明白了 :-)
我用 C 实现了这个,你可以在这里查看代码:https ://gist.github.com/4451478
这个实现需要 200 多行 C 代码,这远远超过了书中所写的大约 20 行 Haskell 代码。所以我不确定我是否在 C 中做解析器组合器的正确轨道,以及是否有任何可能的改进。欢迎任何建议。提前致谢。