使用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 ^ 这就是我们想要的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- twitter-bootstrap – ember.js中的Bootstrap Tooltip
- angular分页组件
- bootstrap-警告框
- 允许通过docker-machine运行的容器与父OSX系统上的Mysql或X
- Verify an App Store Transaction Receipt 【苹果服务端 验
- twitter-bootstrap – jquery ui tooltip与bootstrap 3工具
- 单元测试 – Angular 2:如何在单元测试时模拟ChangeDetect
- bootstrap笔记备忘
- scala – 不变性和共享参考 – 如何调和?
- Angularjs – 多个$http REST调用(第二个调用依赖于第一个输