我想编写一个解析器,它产生一些数据结构并通过在其上运行谓词来验证其一致性。如果谓词返回false
,解析器应该返回一个自定义Error
对象(而不是 a Failure
,因为这可以通过 来实现^?
)。
我正在寻找可以实现这一目标的解析器上的一些运算符。例如,假设我想解析一个整数列表并检查它们是否不同。我想要这样的东西:
import util.parsing.combinator.RegexParsers
object MyParser extends RegexParsers {
val number: Parser[Int] = """\d+""".r ^^ {_.toInt }
val list = repsep(number, ",") ^!(checkDistinct, "numbers have to be unique")
def checkDistinct(numbers: List[Int]) = (numbers.length == numbers.distinct.length)
}
上面代码中的^!
就是我要找的。如何验证解析器输出并在未验证时返回有用的错误消息?