gpt4 book ai didi

parsing - Scala 解析器组合器中的错误和失败

转载 作者:行者123 更新时间:2023-12-04 14:02:05 29 4
gpt4 key购买 nike

我想使用 Scala Parser Combinator 为某些定义的语言实现一个解析器。但是,编译该语言的软件并没有实现该语言的所有功能,因此如果使用这些功能,我想失败。我试图在下面伪造一个小例子:

object TestFail extends JavaTokenParsers {
def test: Parser[String] =
"hello" ~ "world" ^^ { case _ => ??? } |
"hello" ~ ident ^^ { case "hello" ~ id => s"hi, $id" }
}

即,解析器在“hello”+某个标识符上成功,但如果标识符为“world”则失败。我看到 Parsers 类中存在 fail() 和 err() 解析器,但我不知道如何使用它们,因为它们返回 Parser[Nothing] 而不是 String。文档似乎没有涵盖这个用例......

最佳答案

在这种情况下,您需要 err ,不是 failure ,因为如果析取中的第一个解析器失败,您将继续进行第二个解析器,这不是您想要的。

另一个问题是 ^^相当于 map ,但你想要 flatMap , 自 err("whatever")Parser[Nothing] ,不是 Nothing .您可以使用 flatMap方法在 Parser ,但在这种情况下,使用(完全等效)>> 更为惯用。运算符(operator):

object TestFail extends JavaTokenParsers {
def test: Parser[String] =
"hello" ~> "world" >> (x => err(s"Can't say hello to the $x!")) |
"hello" ~ ident ^^ { case "hello" ~ id => s"hi, $id" }
}

或者,更简单一点:
object TestFail extends JavaTokenParsers {
def test: Parser[String] =
"hello" ~ "world" ~> err(s"Can't say hello to the world!") |
"hello" ~ ident ^^ { case "hello" ~ id => s"hi, $id" }
}

任何一种方法都应该做你想做的。

关于parsing - Scala 解析器组合器中的错误和失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17448117/

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