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

使用Scala / SBT解析器组合器重复依赖解析器

发布时间:2020-12-16 10:02:25 所属栏目:安全 来源:网络整理
导读:解析Value [,Value]形式的字符串可以通过rep1sep(Value,’,’)轻松完成.当Value解析器依赖于重复中先前解析的值时,有没有办法实现rep1sep功能?例如,强制要求每个值必须是唯一的? 依赖解析器的标准技术是flatMap,但是我无法正常工作.这是一个这样的尝试: d
解析Value [,Value]形式的字符串可以通过rep1sep(Value,’,’)轻松完成.当Value解析器依赖于重复中先前解析的值时,有没有办法实现rep1sep功能?例如,强制要求每个值必须是唯一的?

依赖解析器的标准技术是flatMap,但是我无法正常工作.这是一个这样的尝试:

def Values(soFar: Set[Value]): Parser[Set[Value]] =
  Value(soFar) flatMap { v => (',' ~> Values(soFar + v)).?.map { _ getOrElse soFar } }

def Value(soFar: Set[Value]): Parser[Value] =
  Num+ flatMap { v => if (soFar.contains(v)) failure("%d already appears".format(v)) else success(v) }

一般来说,我需要一种rep1sep形式,其中解析器参数是从Seq [A]到Parser [A]的函数:

def rep1sepDependent(rep: Seq[A] => Parser[A],sep: Parser[Any]): Seq[A] = ???

注意:我意识到用例在这里是有问题的,并且在解析后更好地处理验证唯一性.我在使用SBT解析组合器来完成选项卡时遇到了这个问题 – 具体来说,我想仅为那些用户尚未输入的键提供键/值对的完成选项.请参见this parser for a full example和可构建的SBT项目.

解决方法

以下内容不像rep1sepDependent那样通用,但它有效:

def rep1sepUnique[T](p: => Parser[T],q: => Parser[Any]) = {
  def checkIfSeen(seen: Set[T]): Parser[Set[T]] = q ~> p >> (v =>
    if (seen(v)) failure("Duplicate: %s".format(v)) else checkIfSeen(seen + v)
  ) | success(seen)
  p >> (v => checkIfSeen(Set(v)))
}

例如:

import scala.util.parsing.combinator._

object parseUniqueWords extends RegexParsers {
  def rep1sepUnique[T](p: => Parser[T],q: => Parser[Any]) = {
    def checkIfSeen(seen: Set[T]): Parser[Set[T]] = q ~> p >> (v =>
      if (seen(v)) failure("Duplicate: %s".format(v)) else checkIfSeen(seen + v)
    ) | success(seen)
    p >> (v => checkIfSeen(Set(v)))
  }

  def apply(s: String) = parseAll(rep1sepUnique("w+".r,","),s)
}

这给了我们:

scala> parseUniqueWords("aaa,bb,c")
res0: parseUniqueWords.ParseResult[Set[String]] = [1.9] parsed: Set(aaa,c)

scala> parseUniqueWords("aaa,aaa")
res1: parseUniqueWords.ParseResult[Set[String]] = 
[1.11] failure: Duplicate: aaa

aaa,aaa
          ^

这就是我们想要的.

(编辑:李大同)

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

    推荐文章
      热点阅读