scala 组合器解析器没有像我想象的那样回溯......

2023-12-21

我一直在盲目地盯着自己的这个问题,我想这可能是一个真正愚蠢的问题。但我必须放下我的骄傲。

我有这个组合器解析器,它不会像我想象的那样回溯。我已将其简化为一个小示例,但没有完全删除上下文。感觉就像“foobar”——示例更难阅读。我来啦:

@RunWith(classOf[JUnitRunner])
class ParserBacktrackTest extends RegexParsers with Spec with ShouldMatchers {
  override def skipWhitespace = false

  lazy val optSpace = opt(whiteSpace)
  lazy val number = """\d+([\.]\d+)?""".r
  lazy val numWithOptSpace = number <~ optSpace

  private def litre = numWithOptSpace <~ ("litre" | "l")
  def volume = litre ^^ { case _ => "volume" }

  private def namedPieces = numWithOptSpace <~ ("pcs") ^^ { case _ => "explPcs" }
  private def implicitPieces = number ^^ { case _ => "implPcs" }
  protected def unitAmount = namedPieces | implicitPieces

  def nameOfIngredient = ".*".r

  def amount = volume | unitAmount
//  def amount = unitAmount
  protected def ingredient = (amount <~ whiteSpace) ~ nameOfIngredient

  describe("IngredientParser") {
    it("should parse volume") {
      shouldParse("1 litre lime")
    }
    it("should parse explicit pieces") {
      shouldParse("1 pcs lime")
    }
    it("should parse implicit pieces") {
      shouldParse("1 lime")
    }
  }

  def shouldParse(row: String) = {
    val result = parseAll(ingredient, row)
    result match {
      case Success(value, _) => println(value)
      case x => println(x)
    }
    result.successful should be(true)
  }
}

那么第三次测试失败了:

(volume~lime)
(explPcs~lime)
[1.4] failure: string matching regex `\s+' expected but `i' found

1 lime
   ^

所以看来litre-parser消耗了 l 然后当它找不到任何空间时失败了。但我本以为它会回溯并尝试下一个生产规则。显然implicitPieces解析器解析这一行,因为如果我删除前面的卷解析器(删除注释),它会成功

(implPcs~litre lime)
(explPcs~lime)
(implPcs~lime)

为什么不是amount回溯?我有什么误解吗?


我只想发布一个最小的例子来说明我的误解。我以为这会成功:

  def foo = "foo" | "fo"
  def obar = "obar"

  def foobar = foo ~ obar

  describe("foobar-parser") {
    it("should parse it") {
      shouldParseWith(foobar, "foobar")
    }
  }

但回溯过去|不是这样的。析取解析器将消耗“foo”并且永远不会将其返还。

它必须被标准化,以便析取被移到顶层:

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

scala 组合器解析器没有像我想象的那样回溯...... 的相关文章

  • 将 Scala Dataframe 写入 CSV 文件时应用 UTF8 编码

    在 Spark2 Scala 中将数据帧写入 CSV 文件时如何正确应用 UTF8 编码 我正在使用这个 df repartition 1 write mode SaveMode Overwrite format csv option he
  • Scala:在运行时获取 mixin 接口

    我需要在运行时从给定的类获取所有接口 全部加载在类加载器中 例如 如果一个类是这样声明的 trait B trait C trait D class A extends B with C with D 我想在运行时获取这些信息 A 取决于
  • 了解如何使用 apply 和 unappy

    我试图更好地理解 的正确用法apply and unapply方法 考虑到我们想要序列化和反序列化的对象 这是正确的用法吗 即斯卡拉方式 的使用apply and unapply case class Foo object Foo appl
  • Scala:如何编写将类型化为接收者的实现类型的对象返回的方法

    我知道 Scala 中不推荐使用案例类继承 但为了简单起见 我在以下示例中使用了它 scala gt case class Foo val f String def foo g String Foo this copy f g define
  • 重塑案例类构造函数?

    试图找到一种方法来 重塑 案例构造函数以填充某些默认值 以下情况可能吗 def reshape T R1 lt HList R2 lt HList h R1 R2 gt T example case class MyClass a Doub
  • Java / Scala Future 由回调驱动

    简洁版本 我怎样才能创建一个Promise
  • Scala:具有复杂结构的树插入尾递归

    我正在 scala 中创建自定义对象树 并且我的插入方法引发堆栈溢出 因为它不是尾递归 但是 我不太清楚如何使其尾递归 我见过使用 累加器 变量的相关示例 但它们要么是只能相乘和覆盖的整数之类的东西 要么是我在适应树时遇到困难的列表 这是我
  • Scala 相当于 Java 的 Number

    我正在尝试为数值域类型构建类型层次结构 例如AYear is an Int 这是一个Number a Percentage is a Double 这是一个Number等等 我需要层次结构以便我可以调用toInt or toDouble关于
  • Scala Array.apply 有何魔力

    来自 scala 2 10 4 的 array scala Array定义为 final class Array T length Int extends java io Serializable with java lang Clonea
  • 最小重复子串

    我正在看 Perl代码高尔夫页面 http www perlmonks org node id 82878 不要问为什么 并遇到了这个 第 3 洞 最小重复图案 编写一个子例程 它接受一个字符串 该字符串可能包含 重复模式 并返回最小的重复
  • 阶乘的 Scala 排列

    我怎样才能找到n Scala 中某些字母的排列 Scala 2 9 RC1 scala gt abc permutations toList res58 List String List abc acb bac bca cab cba
  • 通用特征的隐式转换

    我正在实现一个数据结构 并希望用户能够使用任何类型作为密钥 只要他提供一个合适的密钥类型来包装它 我有这个关键类型的特质 这个想法是进行从基类型到键类型的隐式转换 反之亦然 实际上 只使用基类型 该特征看起来像这样 trait Key T
  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • 使用 scala 在 Flink 中进行实时流预测

    弗林克版本 1 2 0斯卡拉版本 2 11 8 我想使用 DataStream 来使用 scala 中的 flink 模型进行预测 我在使用 scala 的 flink 中有一个 DataStream String 其中包含来自 kafka
  • 分析 sbt 构建

    我的 sbt 构建需要很长时间 它又大又复杂 很难知道从哪里开始清理 看起来 sbt 保留了很多关于构建结构的元数据 包括相互依赖关系 命名任务 范围界定等 有了所有这些元数据 似乎很容易跳入并测量每个不同任务 及其范围 花费的时间 在代码
  • Scalatest PlusPlay Selenium 无法调整窗口大小

    对此已经研究了一段时间 我似乎找不到使用 scalatest plus 调整窗口大小的方法 我发现在线搜索或文档的唯一方法http doc scalatest org 2 1 5 index html org scalatest selen
  • 如何使用 log4j 自定义附加程序在 HDFS 上创建日志?

    Overview 我们希望使用 log4j 记录 Spark 作业活动 并将日志文件写入 HDFS Java 8 Spark 2 4 6 Scala 2 1 2 Hadoop 3 2 1 我们无法找到本地 apache log4j 附加程序
  • Spark中如何获取map任务的ID?

    Spark中有没有办法获取map任务的ID 例如 如果每个映射任务都调用用户定义的函数 我可以从该用户定义的函数中获取该映射任务的 ID 吗 我不确定您所说的地图任务 ID 是什么意思 但您可以使用以下方式访问任务信息TaskContext
  • 如何访问 Scala XML 中的父元素

    The scala xml包表示带有标记树节点的 XML 但是这棵树在 Scala 2 7 中是单向的吗 因为似乎没有办法访问Elem给定的父级Elem 这似乎同样适用于父母Document 例如 在 XOM 中你有getParent an

随机推荐

  • PyBind11 析构函数未调用?

    我有一个c 类包裹着PyBind11 问题是 当Python脚本结束c destructor不会被自动调用 这会导致不整齐的退出 因为网络资源需要由析构函数释放 作为解决方法 有必要显式删除Python反对 但我不明白为什么 请有人解释一下
  • 文本环绕段落中居中的图像

    例如 text text text text text text text text text text text text text text text text text text text text text text text te
  • 用汇编语言将 2 个数字相加并打印结果

    我需要有关如何添加两个数字然后打印结果的帮助 这是我的代码 MODEL SMALL STACK 200H DATA NUM1 DB 12 NUM2 DB 3 VAL DB MSG1 DB The sum is CODE BEGIN PROC
  • 如何在执行之前打印每个命令? [复制]

    这个问题在这里已经有答案了 设置在执行之前打印每个命令的 Bash 脚本的最佳方法是什么 这对于调试目的来说非常有用 我已经尝试过这个 CMD my command params gt stdout txt 2 gt stderr txt
  • 更改vue路由器路由而不更改URL

    在我的前端中 我想将用户重定向到错误视图 以防初始化出错 为此 我准备了一个可以通过特定路径调用的特殊错误视图 为了改善用户体验 我不想将 url 替换为类似的内容 error 但我还是想利用vue router 您知道如何实现这一目标吗
  • 如何在预览中构建带有注释的 swiftui 类 mainactor

    所以 我有一个名为设置的类 我在所有地方都使用它 并且特别希望其他视图在内容更改时做出反应 我用 MainActor 注释了它 当运行应用程序时 一切正常 但是 在预览中我只是尝试创建一个实例 struct ContentView Prev
  • 如何在 stackNavigator 屏幕内水平滑动?

    我正在尝试在同一屏幕的不同屏幕之间创建滑动导航StackNavigator 当我设定swipeEnabled true in navigationOptions 我的应用程序宁愿在不同的选项卡之间导航 我宁愿想在同一个堆栈中导航Screen
  • 重新排列数据框中的行

    我在 R 中有一个数据框 如下所示 有两列 ID phone number Mark 866458 Paul 986564 Jack 987543 Mary 523422 我想要这种只有一列的输出 Mark 866458 Paul 9865
  • 在 for 循环和条件语句中添加到 scala 映射

    我收到一条错误消息 错误 类型参数 Any 不符合特征 Cloneable 的类型参数边界 A 具体来说 var M mutable Map Int mutable Set Int for i lt 1 to 100 j lt 1 to 1
  • knockout.js afterRender 是如何工作的?

    Knockout js 的 afterRender 的文档我不清楚 它的目的是什么以及我们如何使用它 主要的使用示例有哪些 昏死渲染后每次复制 foreach 块并将其插入到文档中时都会调用 无论是在 foreach 首次初始化时 还是在稍
  • Google 可视化图表未显示第一列

    我在使用 Google Visualization API 时遇到问题 图表中的某些数据未显示 该图表相当简单 有 4 列和两行 http savedbythegoog appspot com id ae0853b788af3292b554
  • “光标”选项是必需的,来自每个聚合的错误

    我从特定 NodeJS 应用程序的每个 mongoose 聚合中收到 The cursor option is required 错误 但在同一系统中 具有猫鼬聚合的其他应用程序运行良好 解决办法是什么 顺便说一句 相同的应用程序在其他系统
  • 在单个应用程序上下文中定义两个相同类的 bean

    如果我定义同一类的两个 bean 并且没有给出任何范围 那么将创建多少个类的实例 例如 在 applicationContext xml 中
  • 我可以从我的网页启动适用于 Google Chrome 网络应用程序的 VNC 查看器吗?

    我正在构建一个 Web 服务 为远程计算机提供 VNC 连接 目前我正在使用一个名为 novnc 的项目将 VNC 嵌入到我的网页的元素中 然而 它非常慢 尤其是网络浏览器 eclipse等 然而 当我尝试 novnc 发布的 VNC Vi
  • 复制粘贴到 Python 交互式解释器和缩进中

    这段代码 文件test py if 1 print foo print bar 可以成功执行execfile test py or python test py 但是当尝试将其复制粘贴到 Python 解释器中时 File
  • 指定的任务可执行位置“...\packages\Microsoft.Net.Compilers.1.3.2\build\..\tools\csc.exe”无效

    我将代码从 TFS 下载到了 C 上的一个新文件夹 但编译器似乎遇到了问题 我删除了 suo 文件 但仍然有同样的问题和 68 个警告 因为我从未遇到过这样的问题 所以我不知道需要在此处发布哪些信息来解决它 这就是我在错误列表中看到的内容
  • MSVC:显式模板实例化失败,而隐式实例化成功

    我刚刚遇到了 MSVC 版本 12 更新 5 的问题 如果模板函数具有通过 SFINAE 禁用的重载 则显式实例化模板函数会失败 但是 调用该函数 从而隐式实例化它 是有效的 示例代码 include
  • 如何使用Postman将对象上传到Firebase Storage进行测试?

    如何使用 postman 将图像上传到 Firebase 云存储以进行测试 在这里 我们将尝试使用以下命令将图像上传到 Firebase Storage 简单上传请求在谷歌云存储 JSON API 1 您需要在 FireBase 控制台创建
  • PHP 简单 HTML DOM 解析器的字符编码问题

    我正在使用 PHP 简单 HTML DOM 解析器http simplehtmldom sourceforge net 从其他域获取页面标题 元描述和元标签等数据 然后将其插入数据库 但我在编码方面遇到了一些问题 问题是我没有从那些非英语网
  • scala 组合器解析器没有像我想象的那样回溯......

    我一直在盲目地盯着自己的这个问题 我想这可能是一个真正愚蠢的问题 但我必须放下我的骄傲 我有这个组合器解析器 它不会像我想象的那样回溯 我已将其简化为一个小示例 但没有完全删除上下文 感觉就像 foobar 示例更难阅读 我来啦 RunWi