Parsing 如何使用scala组合解析器抛出带有有意义消息的异常?

Parsing 如何使用scala组合解析器抛出带有有意义消息的异常?,parsing,scala,grammar,Parsing,Scala,Grammar,当语言不符合scala组合解析器的语法时,我想抛出一个异常。下面是一个规则示例: def record: Parser[Record] = "-" ~ opt(recordLabel) ~ repsep(column, ",") ^^ { case "-" ~ label ~ columns => new Record(label, columns) } 假设在repsep(列,“,”)部分中,它们意外地生成了这样的字符串 a, b, c, d, 这是无效的,因为它以一个“,”

当语言不符合scala组合解析器的语法时,我想抛出一个异常。下面是一个规则示例:

def record: Parser[Record] = "-" ~ opt(recordLabel) ~ repsep(column, ",") ^^ {
    case "-" ~ label ~ columns => new Record(label, columns)
}
假设在repsep(列,“,”)部分中,它们意外地生成了这样的字符串

a, b, c, d,
这是无效的,因为它以一个“,”结尾,而不应该在那里。调用parseAll()时,解析器不会停止,而是如何使它抛出一个人类可读的有意义的异常?(自定义文本、行号等)

编辑:好的,我发现了一些有用的东西,但我对它的可定制性不满意:

def loadFrom(filename: String) {
    val source = 
        Source.fromFile(filename).getLines.mkString("\n")
    val parseResult = parseAll(tables, source)
    if(!parseResult.successful) {
        throw new TestDataParseException(parseResult.toString)
    }
}
toString打印一条OK消息,但当它找到一个空格(有时在我的IDE中看起来像块/正方形)时,它会打印一些奇怪的东西,比如想要“\z”。我宁愿说,“嘿,你忘了一个逗号!”

行号/列以[x.y]的形式打印出来。实际上我想展示[Line:x,Column:y],因为人们会更直观地知道这是什么


谢谢

Booya!就是这样。非常感谢!
parseAll(tables, source) match {
  case Success(ast, _) => //do something
  case NoSuccess(msg, next) => {
        println("Failed at line %s, column %s: %s".format(
                    next.pos.line, next.pos.column, msg))
  }
}