parser-combinators相关内容

解析器组合器可以变得高效吗?

大约 6 年前,我在 OCaml 中对自己的解析器组合器进行了基准测试,发现它们比当时提供的解析器生成器慢约 5 倍.我最近重新审视了这个主题,并对 Haskell 的 Parsec 与一个简单的手动优先级爬升解析器进行了基准测试 用 F# 编写,并惊讶地发现 F# 比 Haskell 快 25 倍. 这是我用来从文件中读取大型数学表达式、解析和评估它的 Haskell 代码: impor ..
发布时间:2022-01-05 10:09:58 其他开发

FParsec 标识符与关键字

对于带有关键字的语言,需要进行一些特殊的技巧以防止例如“if"被解释为标识符和“ifSomeVariableName"在令牌流中变成关键字“if"后跟标识符“SomeVariableName". > 对于递归下降和 Lex/Yacc,我只是采用了在词法分析器和解析器之间转换标记流的方法(根据有用的说明). 但是,FParsec 似乎并没有真正执行单独的词法分析器步骤,所以我想知道处理这个 ..
发布时间:2022-01-05 09:59:55 其他开发

使用 Scala 解析器组合器解析 CSV 文件

我正在尝试使用 Scala 解析器组合器编写 CSV 解析器.语法基于 RFC4180.我想出了以下代码.它几乎可以工作,但我无法正确分离不同的记录.我错过了什么? object CSV 扩展 RegexParsers {def COMMA =“,"def DQUOTE = "\"";def DQUOTE2 = "\"\""^^ { 案例 _ =>“\""}def CR = "\r";def L ..
发布时间:2021-12-07 13:30:36 其他开发

语法规则的 def 或 val 或惰性 val ?

我一般知道 def 和 val 和 lazy val 之间的区别,但我不确定它们的影响到解析器组合器.我见过的所有例子都包含这样的代码: def 语句:解析器[语句] =if 语句 |while语句 |表达式语句 |... 从我做过的一些实验来看,似乎 val 和 lazy val 也能工作,但我不确定是否有它们不会的情况不再工作,例如递归或定位解析器或诸如此类. 请赐教! 解决方 ..
发布时间:2021-07-15 21:16:17 其他开发

如何忽略解析器组合器中的单行注释

我有一个可用的解析器,但我刚刚意识到我不适合评论.在我正在解析的 DSL 中,注释以 ; 字符开头.如果遇到 ;,该行的 rest 将被忽略(但不是全部,除非第一个字符是 ;). 我正在为我的解析器扩展 RegexParsers 并忽略空格(默认方式),所以无论如何我都会丢失换行符.我也不希望修改每个解析器来满足注释的可能性,因为语句可以跨越多行(因此每个语句的每个部分都可能以注释结尾).有 ..
发布时间:2021-07-15 21:11:23 其他开发

如何跳过空格但将其用作解析器组合器中的标记分隔符

我正在尝试构建一个小型解析器,其中令牌(幸运的是)从不包含空格.空格(空格、制表符和换行符)本质上是标记分隔符(除了有括号等的情况). 我正在扩展 RegexParsers 类.如果我打开 skipWhitespace,当下一个标记与前一个的正则表达式匹配时,解析器会贪婪地将标记连接在一起.另一方面,如果我关闭 skipWhitespace,它会抱怨,因为空格不是定义的一部分.我试图尽可能地 ..
发布时间:2021-07-15 20:57:08 其他开发

将组合解析器的列表/序列转换为一个

我有一个值列表,我可以从中构建一个解析器列表,这些解析器通过映射依赖于这些值(参见示例).然后我想要做的是通过串联将解析器列表变成单个解析器. 一种可能性是使用 foldLeft 和 ~: parsers.foldLeft(success(Nil)){case (ps,p) =>rs ~ p ^^ {case xs ~ x =>x ::xs}} ^^ (_.reverse) 这样有效吗? ..
发布时间:2021-07-15 20:45:11 其他开发

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

我正在编写一个 Scala 解析器组合语法,它读取以换行符分隔的单词列表,其中列表由一个或多个空行分隔.给定以下字符串: 猫鼠马苹果橙子梨 我想让它返回List(List(cat, mouse, horse), List(apple, orange, pear)). 我写了这个基本语法,它将单词列表视为换行符分隔的单词.请注意,我必须覆盖 whitespace 的默认定义. impor ..
发布时间:2021-07-15 20:41:01 其他开发

如何将解析器与不同类型的 Elem 结合使用

我正在尝试创建一个结合了 Regex 解析器和我拥有的自定义解析器的解析器.我看过 Scala:如何组合来自不同的解析器组合器对象,但该问题和答案涉及具有相同类型的 Elem 的解析器. 假设我有几个 RegexParsers,还有一个用于查找字符串的解析器: trait NumbersParsers 扩展 RegexParsers {def number = """\d+""".r}tr ..
发布时间:2021-07-15 20:36:17 其他开发

访问 Scala Parser 正则表达式匹配数据

我想知道是否有可能从下面的语法中的匹配正则表达式中获取 MatchData. object DateParser 扩展 JavaTokenParsers {....val dateLiteral = """(\d{4}[-/])?(\d\d[-/])?(\d\d)""".r ^^ {...获取匹配数据}} 当然,一种选择是在块内再次执行匹配,但由于 RegexParser 已经执行了匹配,我希 ..
发布时间:2021-07-15 20:19:07 其他开发

算术表达式语法和解析器

最近我正在寻找算术表达式的体面语法,但只找到了一些琐碎的语法,例如忽略了 pow(..., ...).然后我自己尝试了它,但有时它并没有像人们预期的那样工作.例如,我错过了在表达式前面允许一元 - 并修复它.也许有人可以看看我目前的方法并改进它.此外,我认为其他人可以利用,因为能够解析算术表达式是一项常见任务. import scala.math._导入 scala.util.parsing.c ..
发布时间:2021-07-15 20:17:21 其他开发

何时使用 scala 三重插入符 (^^^) 与双重插入符 (^^) 和 into 方法 (>>)

有人可以解释在设计 Scala 解析器组合器时如何以及何时使用三重插入符号 ^^^(与双插入符号 ^^)?以及何时/如何使用 parser.into() 方法 (>>). 解决方案 我将从一个使用 Scala 的 Option 类型的示例开始,它在一些重要方面类似于 Parser代码>,但可以更容易推理.假设我们有以下两个值: val fullBox: Option[String] = ..
发布时间:2021-07-15 19:53:04 其他开发

理解 Scala 解析器组合器中的波浪号

我是 Scala 的新手,在阅读有关解析器组合器的内容时​​(背后的魔法解析器组合器、Scala 中的特定领域语言)我遇到了这样的方法定义: def classPrefix = "class" ~ ID ~ "(" ~formals ~ ")" 我一直在阅读 scala.util.parsing.Parsers 的 API 文档,它定义了一个名为 (波浪号) 的方法,但我仍然不太了解它在上面的 ..
发布时间:2021-07-15 19:30:44 其他开发

使用 nom 捕获整个连续匹配的输入

我希望应用一系列 nom 解析器并返回完整的 &str 匹配.我想匹配 a+bc+ 形式的字符串.使用现有的 chain! 宏 我可以得到非常接近: named!(aaabccc ,地图资源!(链!(a: take_while!(is_a) ~标签!("b") ~take_while!(is_c) ,||{一种}),from_utf8)); 哪里 fn is_a(l ..
发布时间:2021-07-13 20:58:39 其他开发