scala combinator解析器没有回溯,因为我原以为……
发布时间:2020-12-16 18:11:15 所属栏目:安全 来源:网络整理
导读:我一直盯着自己对这个问题视而不见,我想这可能是一个真正愚蠢的问题.但我必须吞下自己的骄傲. 我有这个组合器解析器,它没有像我想象的那样回溯.我一直在将它简化为一个小例子而没有完全删除上下文.感觉像“foobar” – 例子更难阅读.我来啦: @RunWith(class
我一直盯着自己对这个问题视而不见,我想这可能是一个真正愚蠢的问题.但我必须吞下自己的骄傲.
我有这个组合器解析器,它没有像我想象的那样回溯.我一直在将它简化为一个小例子而没有完全删除上下文.感觉像“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 ^ 所以似乎升解析器消耗了l然后当它找不到任何空间时失败了.但我会认为它会回溯并尝试下一个生产规则.显然,implicitPieces解析器解析了这一行,因为如果删除前面的卷解析器(删除注释),它就会成功 (implPcs~litre lime) (explPcs~lime) (implPcs~lime) 为什么金额不回溯?我有什么误会? 解决方法
它没有回溯,因为1石灰
>成分从量开始 所以升,体积和数量都是成功的!这就是为什么然后整个事情继续与成分的第二部分,即whiteSpace. HTH! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 在vim编辑器python实现tab补全功能
- ubuntu – 在Docker容器中添加PPA失败
- angularjs – Firebase – 如何在AngularFire中更新许多孩子
- 使用Ansible而不是Dockerfile设置Docker容器有什么好处?
- wai-aria – 如何在ngMaterial中禁用ngAria?
- AngularJS进阶(四十二)ng-options渲染的第一项为空的解决办
- 数组像bash(配置文件)中的数据结构?
- scala – 如何在给定多个条件的情况下对Spark数据帧执行“查
- 【20160119】貌美的bootstrap模板和git安装
- angularjs – Angular Google Maps – 自动设置“中心”和“