使用 FoldLine 解析多个块

2024-05-14

对于这个简化的问题,我试图解析一个如下所示的输入

foo bar
 baz quux 
 woo
hoo xyzzy 
  glulx

into

[["foo", "bar", "baz", "quux", "woo"], ["hoo", "xyzzy", "glulx"]]

我尝试过的代码如下:

import qualified Text.Megaparsec.Lexer as L
import Text.Megaparsec hiding (space)
import Text.Megaparsec.Char hiding (space)
import Text.Megaparsec.String
import Control.Monad (void)
import Control.Applicative

space :: Parser ()
space = L.space (void spaceChar) empty empty

item :: Parser () -> Parser String
item sp = L.lexeme sp $ some letterChar

items :: Parser () -> Parser [String]
items sp = L.lineFold sp $ \sp' -> some (item sp')

items_ :: Parser [String]
items_ = items space

这适用于一个块items:

λ» parseTest items_ "foo bar\n baz quux\n woo"
["foo","bar","baz","quux","woo"]

但一旦我尝试解析many items,它在第一条未缩进的行上失败:

λ» parseTest (many items_) "foo bar\n baz quux\n woo\nhoo xyzzy\n  glulx"
4:1:
incorrect indentation (got 1, should be greater than 1)

或者,使用更简单的输入:

λ» parseTest (many items_) "a\nb"
2:1:
incorrect indentation (got 1, should be greater than 1)

Megaparsec 的作者在这里 :-) 当你使用时要记住一件事 Megaparsec 的特点是它的词法分析器模块确实是故意的“低级”。它 不会做任何你自己无法构建的事情,它不会将你锁定在任何 特定的“框架”。所以基本上在你的情况下你有空间消费者sp'为您提供,但您应该谨慎使用它,因为它肯定会 当您的缩进级别小于或等于的缩进级别时失败 顺便说一句,整个折叠的开始,这就是折叠的结束方式。

去引用the docs https://hackage.haskell.org/package/megaparsec-5.0.0/docs/Text-Megaparsec-Lexer.html#v:lineFold:

创建一个支持行折叠的解析器。第一个参数用于 消耗线折叠组件之间的空白,因此它必须消耗 换行符才能正常工作。第二个参数是一个回调 接收自定义的占用空间的解析器作为参数。这个解析器应该是 在线折叠的单独组件之后使用,可以将其放在不同的位置上 线。

sc = L.space (void spaceChar) empty empty

myFold = L.lineFold sc $ \sc' -> do
  L.symbol sc' "foo"
  L.symbol sc' "bar"
  L.symbol sc  "baz" -- for the last symbol we use normal space consumer

折线不能无限期地运行,因此您应该预料到它会失败并出现错误 消息类似于您现在的消息。要想成功,你应该思考 关于完成它的方法。这通常是通过使用“正常”来完成的 行折叠末尾的空间消费者:

space :: Parser ()
space = L.space (void spaceChar) empty empty

item :: Parser String
item = some letterChar

items :: Parser () -> Parser [String]
items sp = L.lineFold sp $ \sp' ->
  item `sepBy1` try sp' <* sp

items_ :: Parser [String]
items_ = items space

item `sepBy1` try sp'运行直到失败然后sp抓住剩下的,所以 可以解析下一个折叠。

λ> parseTest items_ "foo bar\n baz quux\n woo"
["foo","bar","baz","quux","woo"]
λ> parseTest (many items_) "foo bar\n baz quux\n woo\nhoo xyzzy\n  glulx"
[["foo","bar","baz","quux","woo"],["hoo","xyzzy","glulx"]]
λ> parseTest (many items_) "foo bar\n baz quux\n woo\nhoo\nxyzzy\n  glulx"
[["foo","bar","baz","quux","woo"],["hoo"],["xyzzy","glulx"]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 FoldLine 解析多个块 的相关文章

  • 语法问题

    我需要解析一个表达式 并且我正在使用 boost spirit 表达式必须具有以下形式 字符串 PV 后面除了 之外的任何内容 我正在使用以下语法 P S gt gt gt gt V S ch p gt gt ch p V str p PV
  • GHC 8.4 系列的插件名称查找行为发生变化

    更新 原来这是一个 GHC 错误 现已修复 预计在 8 6 4 版本中发布 https ghc haskell org trac ghc ticket 16104 comment 8 https ghc haskell org trac g
  • 不理解 Monoid 定义中态射的表示法

    我试图理解什么Monoid是从范畴论的角度来看的 但我对用来描述它的符号有点困惑 这是维基百科 在范畴论中 幺半群范畴 C I 中的幺半群 或幺半群对象 M 是一个对象 M 和两个态射 M M M 称为乘法 I M 称为单位 我的困惑在于态
  • 使用 VB.NET 覆盖文本文件中的特定行

    我需要执行以下操作 更改文本文件中的行 Path c this certain path 用这条线 Path c that other newer path 这些路径的长度肯定会不同 因此我需要替换引号中的内容 或者完全擦除该行并输入一个新
  • 浏览前奏的源代码会带来奇怪的情况

    我一直在寻找的定义seq并遇到了这个奇怪的事情 为什么所有这些函数都有相同 相似的定义 seq a gt b gt b seq let x x in x inline a gt a inline let x x in x lazy a gt
  • 在不同上下文中使用的多态变量 haskell

    我有以下一段 Haskell 代码 foo Num a gt a gt a gt Either Integer Double gt Either Integer Double foo f x case x of Left i gt Left
  • Beautiful Soup 获取动态表数据

    我有以下代码 url https www basketball reference com leagues NBA 2017 standings html all expanded standings html urlopen url so
  • 我可以在线性时间内检查有界列表是否包含重复项吗?

    假设我有一个Int列表 其中元素已知是有界的 并且列表已知不长于它们的范围 因此它完全有可能不包含重复项 如何才能最快地测试是否是这种情况 我知道nubOrd https hackage haskell org package contai
  • 在 GHCi 中,为什么我不能在 REPL 中显示 `pure 1`?

    我尝试将提升值分配给a gt m Control Applicative gt let a pure 1 当我评价的时候a在 REPL 中 它打印1 gt a 1 因此 我认为可能会实施show for a 并尝试了这个 gt show a
  • 双共体的方法是什么?

    在思考建议哪些更有用的标准课程时到这个 https stackoverflow com a 40833245 745903 class Coordinate c where createCoordinate x gt y gt c x y
  • 在没有互联网连接的情况下使用 cabal 安装 Haskell 软件包

    我有一台根本无法访问互联网的机器 我使用通过随身碟从另一台机器获得的安装程序在其上安装了 Haskell 平台 现在我想安装这个包repa在我的家用机器上 无法访问互联网 我该怎么做呢 我的家用计算机运行的是 Linux Debian 我的
  • 如何在递归方案中派生实例

    我正在测试其中的一些想法本文 http blog sumtypeofway com an introduction to recursion schemes 我想派生 Term 类型的 Eq 实例 LANGUAGE DeriveFuncto
  • 在帖子上生成最近帖子列表时,如何避免依赖循环?

    所以这有效 create archive html do route idRoute compile do posts lt myRecentFirst gitTimes lt lt loadAll posts let archiveCtx
  • 模式匹配中的 Monoid mempty

    我尝试写一个通用的maximum功能类似于Prelude 我的第一个天真的方法如下所示 maximum F Foldable a Ord b gt a b gt Maybe b maximum mempty Nothing maximum
  • Xtext和ANTLR之间有什么关系?

    我听说Xtext最终使用ANTLR 但他们的语法规范文件的格式有些不同 那么两者之间是什么关系呢 Xtext 依赖于 Antlr 解析器生成器来解析输入文件 除此之外 该框架还提供了许多附加值 例如强类型 AST 链接抽象和静态分析以及 E
  • 在 win32/cygwin 上编译 haskell 模块网络

    我正在尝试编译 Network HTTP http hackage haskell org package network http hackage haskell org package network 在 win32 cygwin 上
  • 哈斯克尔状态单子

    是否putState Monad 的函数会更新实际状态还是仅返回具有新值的新状态 我的问题是 State Monad 可以在命令式设置中像 全局变量 一样使用吗 并且确实put修改 全局变量 我的理解是 不 它不会修改初始状态 但是使用单子
  • 用于打印 C/C++ 文件的所有函数定义的 Python 脚本

    我想要一个 python 脚本来打印 C C 文件中定义的所有函数的列表 e g abc c定义两个函数为 void func1 int func2 int i printf d i return 1 我只想搜索文件 abc c 并打印其中
  • 如何在批处理文件中解析带有特殊分隔符的文件?

    我想使用批处理来解析一个如下所示的文件 a string containing various characters and spaces 1 b string containing various characters and space
  • 设置自动缩进不缩进标签

    我在 Windows 上使用 Eclipse CDT 我应该补充一点 总的来说 我对自动格式功能很满意 但有一件事让我烦恼 我不知道如何配置 Eclipsenot带标签的缩进线 这就是我要的 void myfunc goto MYLABEL

随机推荐

  • GProf 输出中缺少函数

    我正在尝试分析一些 C 代码 但最直观地成本最高的函数之一并未出现在 GProf 输出中 int main initialise haloSwap for functions propagate functions void propaga
  • SQL如何将两个日期之间一小时内的事件相加并显示在一行中

    我正在使用 C 和 SQL Server 2005 开发一份报告 我只需显示我们每小时获得的点击次数 桌子很大 输出应如下所示 Row Date Time Hit Count 1 07 05 2012 8 00 3 2 07 05 2012
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • “未定义的行为”是否会扩展到编译时?

    我们都听过这样的警告 如果你调用未定义的行为在 C 或 C 中 任何事情可以发生 这是否仅限于任何运行时行为 或者这还包括任何编译时行为吗 特别是 编译器在遇到调用未定义行为的构造时是否允许拒绝代码 在标准中没有其他要求的情况下 甚至崩溃
  • 渲染:带参数的动作

    我有一个有 2 种方法的类 第一个方法由视图使用一些 GET 参数 params page 调用 我想保存这些参数并通过渲染操作将它们发送到我的第二个方法 class exemple def first sql save of params
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • 获取 int() 参数必须是字符串或数字,而不是“Column”- Apache Spark

    如果我使用以下代码 我会收到此异常 int argument must be a string or a number not Column df df withColumn FY F when df ID substr 5 2 isin
  • 如何避免 NSNumberFormatter 中的四舍五入

    我试图拥有一个最大精度为 2 位小数的数字字符串 而其余小数只是被修剪掉而不是四舍五入 例如 I have 123456 9964 I want 123456 99 gt Just want to trim rest of the deci
  • R-在多个图的外缘绘制居中图例

    我想在具有多个绘图的设备中的绘图区域之外绘制居中图例 SO 中提出了许多关于更改 R 图中图例位置的问题 略有不同 例如 1 R 组合图的通用标题和图例 https stackoverflow com questions 8736966 r
  • 当测试集中不存在响应变量时,h2o 预测有时会失败

    当在不存在响应变量的测试集上进行预测时 如果在训练中对因子变量使用一种热编码 则 h2o 会以各种不同的方式失败 无论是在训练 GLM 时隐式指定还是在其他方法中显式指定时 R 3 4 0 和 h2o 3 12 0 1 中存在此错误 我们还
  • Scala中有类似Java Stream的“peek”操作吗?

    在Java中你可以调用peek x gt println x 在 Stream 上 它将对每个元素执行操作并返回原始流 这与 foreach 不同 foreach 是 Unit Scala 中是否有类似的东西 最好是适用于所有 Monady
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 将类转换为 JSONObject

    我有好几堂这样的课 我想将类转换为 JSONObject 格式 import java io Serializable import com google gson annotations SerializedName public cla
  • 优化 R 中的嵌套 for 循环

    我尝试加速下面的代码 但没有成功 我读到Rfast https cran r project org web packages Rfast Rfast pdf包 但我也未能实现该包 有没有办法优化R中的以下代码 RI lt function
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 根据传递的参数覆盖 Javascript 函数

    是否可以根据传递给函数的参数数量来重写函数 例如 function abc name document write My name is name function abc name friend document write My nam
  • Maven 按顺序构建所有内容

    我有一个项目 其中所有项目都有一个父 pom 定义如下
  • dask apply:AttributeError:“DataFrame”对象没有属性“name”

    我有一个参数数据框 并对每一行应用一个函数 该函数本质上是几个 sql queries 和对结果的简单计算 我正在尝试利用 Dask 的多处理 同时保持结构和界面 下面的例子有效并且确实有显着的提升 def get metrics row
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import