加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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石灰

>成分从量开始
>金额从数量开始
>体积从升开始,然后
>升成功消耗1升1石灰

所以升,体积和数量都是成功的!这就是为什么然后整个事情继续与成分的第二部分,即whiteSpace.

HTH!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读