sca*_*1sk 6 parsing scala parser-combinators
我想使用Scala Parser Combinators为某些定义的语言实现解析器.但是,编译该语言的软件并未实现所有语言的功能,因此如果使用这些功能,我希望失败.我试着在下面打造一个小例子:
object TestFail extends JavaTokenParsers {
def test: Parser[String] =
"hello" ~ "world" ^^ { case _ => ??? } |
"hello" ~ ident ^^ { case "hello" ~ id => s"hi, $id" }
}
Run Code Online (Sandbox Code Playgroud)
即,解析器成功"hello"+某个标识符,但如果标识符是"world"则失败.我看到Parsers类中存在fail()和err()解析器,但我无法弄清楚如何使用它们,因为它们返回Parser [Nothing]而不是String.该文档似乎不包括此用例...
在这种情况下,你想要err
,不是failure
,因为如果分离中的第一个解析器失败,你只会转到第二个,这不是你想要的.
另一个问题是,^^
相当于map
,但你想要flatMap
,因为err("whatever")
是一个Parser[Nothing]
,而不是一个Nothing
.您可以使用该flatMap
方法Parser
,但在此上下文中使用(完全等效的)>>
运算符更为惯用:
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" }
}
Run Code Online (Sandbox Code Playgroud)
或者,更简单一点:
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" }
}
Run Code Online (Sandbox Code Playgroud)
任何一种方法都应该做你想要的.
归档时间: |
|
查看次数: |
1291 次 |
最近记录: |