gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:30:57 25 4
gpt4 key购买 nike

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

我有这个组合器解析器,它不会像我想象的那样回溯。我已将其简化为一个小示例,但没有完全删除上下文。感觉就像“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)

关于scala 组合器解析器没有像我想象的那样回溯......,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9192060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com