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

解析 – Scala Parser组合器中的错误和失败

发布时间:2020-12-16 18:55:04 所属栏目:安全 来源:网络整理
导读:我想使用 Scala Parser Combinators为某些定义的语言实现解析器.但是,编译该语言的软件并未实现所有语言的功能,因此如果使用这些功能,我希望失败.我试着在下面打造一个小例子: object TestFail extends JavaTokenParsers { def test: Parser[String] = "hel
我想使用 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" }
}

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

(编辑:李大同)

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

    推荐文章
      热点阅读