是否有适用于 Haskell 或 Scala 等函数式语言的 LL 解析器生成器?

2024-06-19

我注意到明显缺乏用函数式语言创建解析器的 LL 解析器。我一直在寻找但没有成功的理想发现是为 ANTLR 风格的 LL(*) 语法生成 Haskell 解析器(语法的模小数重新格式化),并且令我惊讶的是,每个最后一个解析器生成器都具有函数我发现的语言目标是某种 LR 解析器。

我想将我正在开发的这种具有功能特性的语言的解析器从 ANTLR 转换为语言本身的自托管,如果我可以将另一种功能语言中几乎肯定正确的东西移植到我的语言中,那将会有很大帮助(最好是我熟悉的 Haskell 和 Scala),而不必完全从头开始重写,尽管最终我可能会这样做,因为核心语言很小。

在这一点上,我很好奇,甚至不仅仅是一个解决方案why没有这样的 LL(*) 甚至 LL(k) 解析器生成器,但有很多 LR 生成器,因为 LL 本质上看起来更容易。


主要原因是大多数用函数式语言编写的 LL(k) 解析器只是使用解析器组合器实现,因为生成解析器组合器库的最简单路径是递归下降 http://en.wikipedia.org/wiki/Recursive_descent_parser.

哈斯克尔的parsec http://hackage.haskell.org/package/parsec, 阿托秒差距 http://hackage.haskell.org/package/parsec, and 多解析 http://hackage.haskell.org/package/polyparseScala 的常用解析器组合器都生成有效的 LL(*) 解析器。

parsec 和 attoparsec 都要求您使用显式的 try 组合器来进行回溯,但这只是为了效率和 scala解析器组合器 http://www.scala-lang.org/api/current/scala/util/parsing/combinator/Parsers.html还可以处理Packrat 解析 http://www.scala-lang.org/api/current/scala/util/parsing/combinator/PackratParsers.html.

考虑以下片段公告 http://byorgey.wordpress.com/2011/03/28/binders-unbound/布伦特·约尔吉 (Brent Yorgey) 最近的作品unbound http://hackage.haskell.org/package/unbound包裹:

parseAtom = parens parseTerm
    <|> var <$> ident
    <|> lam <$> brackets ident <*> parseTerm

很容易看出原来的语法。

LR 解析器需要更复杂的预处理来生成要有效执行的表,因为使用类似的直接手工编码递归上升 http://en.wikipedia.org/wiki/Recursive_ascent_parser非常糟糕。

通过将解析器组合器实现为 EDSL 而不是外部工具,您可以更好地利用编程语言的高级功能。您可以使部分语法更高阶,构建词法分析器黑客 http://en.wikipedia.org/wiki/The_lexer_hack直接进入解析器等。典型的 LR 解析器生成器无法执行这些操作,或者只能在有限的上下文中以临时方式提供它们,因为最终需要能够发出表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有适用于 Haskell 或 Scala 等函数式语言的 LL 解析器生成器? 的相关文章

  • 如何让 Either Monads 了解异步函数(Promises/Future)

    我正在尝试使用 Either Monad 来传输数据 问题是我无法弄清楚如何让我的 Monad 意识到异步操作 这是我所拥有的 let processData Either either sendError sendResponse pro
  • Haskell 中是否可以部分应用第 n 个参数?

    我很好奇是否可以写一个函数apply nth它接受一个函数 参数的数量以及该参数的值 然后返回一个新的 部分应用的函数 我的感觉是 由于类型系统的原因 这是不可能的 但我无法给出令人满意的答案 我也无法提出工作类型签名 如果语言的类型更加松
  • 为什么 Kleisli 不是 Monoid 的一个实例?

    如果您希望附加两个类型 a gt m b 的函数 以便只得到一个附加两个结果的相同类型的函数 您可以使用 Kleisli 来执行此操作 instance Monad m Monoid b gt Monoid Kleisli m a b wh
  • 方法返回类型的类型推断

    当存在显式方法时 为什么 Scala 无法推断方法的返回类型return方法中使用的语句 例如 为什么下面的代码可以编译 object Main def who 5 def main args Array String println wh
  • 通过Listener获取Spark thrift服务器查询中读取的行数

    我正在尝试为我们的 ST 服务器构建一个监控系统 到目前为止 诸如记录查询 检索的行 红色和花费的时间之类的事情都很好 我已经实现了一个自定义侦听器 我能够毫无问题地检索查询和时间 侦听SparkListenerSQLExecutionSt
  • Haskell 中存在量化值的列表

    我想知道为什么这段代码不进行类型检查 LANGUAGE ScopedTypeVariables Rank2Types RankNTypes OPTIONS fglasgow exts module Main where foo forall
  • 使用 Parsec 解析数据并省略注释

    我正在尝试编写一个 Haksell Parsec 解析器 它将文件中的输入数据解析为 LogLine 数据类型 如下所示 Final parser that holds the indvidual parsers final Parser
  • 在函数式编程中画UML类图有什么意义吗?

    我被要求在一个学校项目中展示UML我使用的图表 如果我这样做的话 实现该项目 但我正在做的项目是用 C 语言编写的 并且已经进行了功能编程 因此 我想证明 在不使用面向对象语言的情况下使用类图是没有意义的 但我担心这不是真的 并且无法证实这
  • 在 URL 中嵌入 ETag

    有关 Play 中资产指纹识别的问题 如何要求 Play 在 URL 中嵌入 ETag 而不使用第三方插件 例如 如果 css resource cssETag 为1234 那么它就会变成 css responsive 1234 css 相
  • Python 的“with”是一元吗?

    像我之前的许多鲁莽的先驱者一样 我正在努力穿越理解单子这片无路可走的荒原 我仍然在蹒跚学步 但我不禁注意到 Python 的某种类似 monad 的品质with陈述 考虑这个片段 with open input filename r as
  • 在 Scala 中定义具有多个隐式参数的函数

    如何定义具有多个隐式参数的函数 def myfun arg String implicit p1 String implicit p2 Int doesn t work 它们必须全部放入一个参数列表中 并且该列表必须是最后一个 def my
  • 在 Web.Scotty 中使用 StateT

    我正在尝试制作一个愚蠢的网络服务器 将数据存储为State 我在用着Web Scotty http hackage haskell org package scotty 我之前用过 ReaderT 和 scotty 来访问配置 https
  • 为什么在 haskell 中不带括号不可能进行负数相乘

    乘法5 3在 haskell gchi 中给了我一个错误 但乘以5 3 工作正常 为什么需要括号 ghci GHCi version 7 4 1 http www haskell org ghc for help Loading packa
  • 在 Scala REPL 中访问包私有方法

    假设我有一个private stuff method Stuff something in org my stuff 我可以在 Scala REPL 中做些什么 以便我可以调用Stuff something没有得到错误error value
  • Scala Eclipse 自动完成功能损坏?

    我正在尝试让自动完成功能在 Eclipse 中用于 Scala 开发 我试图从 Scala 类引用 java 类 但自动完成功能从未找到它 例如 以这个 scala 类为例 object Main def main args Array S
  • 从单个字符串创建 Spark DataFrame

    我正在尝试采用硬编码字符串并将其转换为 1 行 Spark DataFrame 具有单列类型StringType 这样 String fizz buzz 将得到一个 DataFrame 其 show 方法如下 fizz buzz 迄今为止我
  • mssql 的 UUID 疯狂

    我的数据库条目有一个 UUID 及其值 使用 Microsoft SQL Server Management Studio 提取 CDF86F27 AFF4 2E47 BABB 2F46B079E98B 将其加载到我的 Scala 应用程序
  • 特征/类类型参数优先于方法类型参数的规则是什么

    我已经使用 scala 一段时间了 我认为我真的开始理解一切 好吧 大多数事情 但我发现自己对 Map 类中的许多方法定义感到困惑 我知道 FoldLeft 等如何工作 但我感到困惑的是 Map 函数中使用的类型参数 我们以 FoldLef
  • JavaFX 控制器如何访问其他服务?

    我将 JavaFX 2 与 Scala 一起使用 我有class Application extends javafx application Application它执行诸如读取应用程序配置等操作 然后它会启动主窗口 该主窗口需要连接到一
  • 在无形状中,有两个列表,其中一个包含另一个的类型类

    在无形中 我正在尝试编写一个需要两个 HList 的函数l1 and l2任意长度 具有以下属性 的长度l1 and l2是相同的 l2包含的确切类型l1 包装在常量外部类型构造函数中 So if l1 was 1 1 2 hello HN

随机推荐

  • 如何正确创建迦太基 cartfile?

    我正在研究购物车文件 迫不及待地想 简单地创建一个购物车文件 就像所有说明所说的那样 只是 如何 简单地 创建一个 Cartfile 我创建了一个纯文本文档 将其命名为 cartfile 并在其中复制了一些依赖项 Ran carthage
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 如何设置旋转元素背面的样式?

    我有一个figure它是可旋转的 通过用户输入任意角度 该旋转明显地使用transition财产 当该元件旋转超过 90 度 90 度时 元件的背面可见 我想对元素的通常隐藏的一面进行与正面不同的设计 但我不确定如何实现这一点 figure
  • 如何在 Swift 中将文件名与文件扩展名分开?

    给定包中文件的名称 我想将该文件加载到我的 Swift 应用程序中 所以我需要使用这个方法 let soundURL NSBundle mainBundle URLForResource fname withExtension ext 无论
  • Swift 运行时库与 Swift 标准库

    In this 关于如何使用 CocoaPods 的教程 https www raywenderlich com 97014 use cocoapods with swift我无法理解以下段落 与 Objective C 不同 标准 Swi
  • 对范围值进行排序

    我想对表示数值范围的字符串数组进行排序 如下所示 b 0 5 100 250 5 25 50 100 250 500 25 50 使用sort我得到的方法 b sort gt 0 5 100 250 25 50 250 500 5 25 5
  • Rails 中的助手 - 构建 html 字符串时的最佳方法是什么?

    我通常这样写助手 def bloco vazio texto btn args titulo content tag h3 Vazio p content tag p texto content tag div titulo tag hr
  • ProcessPoolExecutor 传递多个参数

    ESPN播放器免费 class ESPNPlayerFree def init self player id match id match id team 团队名单1 277906 cA2i150s81HI3qbq1fzi za1Oq5CG
  • 数字和小数的输入掩码

    在测试我的程序后 我发现了以下错误 我在 sqlserver 中的表包含 价格数字 6 2 我的程序的用户输入价格 555 00 就很好了 但是当他输入 555555 时 这是错误的 所以我需要指定掩码 其中尾数是可选的 0 到 999 小
  • 对象克隆库的 Flash 复制?

    这可能是一个非常简单的问题 我只是不知道如何解决 我有一个想要复制的对象 但不知道如何进行 这是我的尝试 var myObj new ObjectClass var duplicate myObj duplicate null myObj
  • JMockit - 初始化问题

    当我使用以下测试时 我收到警告 警告 JMockit 是按需初始化的 这可能会导致某些测试失败 请检查文档以获取更好的初始化方法 这是我的测试实现 package test import static mockit Mockit impor
  • 闭包存储属性初始化有什么好处?

    初始化类的属性时 此代码有什么区别以及优点 缺点 1 let menuBar MenuBar let mb MenuBar return mb and 2 let menuBar MenuBar 两个代码片段都声明并初始化存储的属性 htt
  • Chrome 驱动程序和 Chromium 二进制文件无法在 aws lambda 上运行

    我陷入了一个问题 我需要在 AWS lambda 上做一些抓取工作 所以我按照下面提到的博客及其代码库作为起点 这非常有帮助 并且在运行时环境 Python 3 6 的 AWS lambda 上对我来说工作得很好 https manivan
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • openApi schema 中不区分大小写的字符串参数

    我有一个开放的 API 规范 其参数如下 name platform in query description Platform of the application required true schema type string enu
  • 编写自定义 Eclipse 调试器

    EDIT 一定有某种方法可以解决这个问题 而无需编写全新的调试器 我目前正在研究在现有 java 调试器之上构建的方法 如果有人对如何获取 Java 调试器已有的信息 有关堆栈帧 变量 原始数据等 有任何想法 那将非常有帮助 我想要做的是我
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • Windows CE 6.0 注册表中的时间设置

    我有一台装有 Windows CE 6 0 的 Motorola MC3100 移动条码扫描设备 现在我想让设备在启动时使用我创建的一些注册表文件与我们的域控制器同步其日期 时间 我使用了下面这两个注册表文件来接近我的需要 REG 1 HK
  • 是否有适用于 Haskell 或 Scala 等函数式语言的 LL 解析器生成器?

    我注意到明显缺乏用函数式语言创建解析器的 LL 解析器 我一直在寻找但没有成功的理想发现是为 ANTLR 风格的 LL 语法生成 Haskell 解析器 语法的模小数重新格式化 并且令我惊讶的是 每个最后一个解析器生成器都具有函数我发现的语