我想使用
Scala Parser Combinators为某些定义的语言实现解析器.但是,编译该语言的软件并未实现所有语言的功能,因此如果使用这些功能,我希望失败.我试着在下面打造一个小例子:
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.该文档似乎不包括此用例…
解决方法
在这种情况下,你想要错误,而不是失败,因为如果分离中的第一个解析器失败,你只会转到第二个,这不是你想要的.
另一个问题是^^相当于map,但是你想要flatMap,因为err(“whatever”)是Parser [nothing],而不是nothing.您可以在Parser上使用flatMap方法,但在此上下文中使用(完全等效的)>>更加惯用.操作符:
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" } }
任何一种方法都应该做你想要的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。