解析表单的字符串Value[,Value]+
可以很容易地通过rep1sep(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 形式,其中解析器参数是一个函数 from Seq[A]
to Parser[A]
:
def rep1sepDependent(rep: Seq[A] => Parser[A], sep: Parser[Any]): Seq[A] = ???
注意:我意识到这里的用例是有问题的,并且在解析后更好地处理验证唯一性。我在使用 SBT 解析组合器来完成制表符时遇到了这个问题——具体来说,我想只为用户尚未输入的那些键提供键/值对的完成选项。有关完整示例和可构建的 SBT 项目,请参阅此解析器。