当语言不符合scala组合解析器的语法时,我想抛出一个异常。以下是一个规则示例:
def record: Parser[Record] = "-" ~ opt(recordLabel) ~ repsep(column, ",") ^^ {
case "-" ~ label ~ columns => new Record(label, columns)
}
假设在repsep(column,“,”)部分,他们意外地生成了这样的字符串
a, b, c, d,
这是无效的,因为它以一个“,”结尾,而这个“,”不应该存在。与其说解析器在调用parseAll()时停止,不如说如何使它抛出一个可读的有意义的异常?(自定义文本、行号等)
编辑:好吧,我发现了一些有效的东西,但我对它的可定制性不满意:
def loadFrom(filename: String) {
val source =
Source.fromFile(filename).getLines.mkString("
")
val parseResult = parseAll(tables, source)
if(!parseResult.successful) {
throw new TestDataParseException(parseResult.toString)
}
}
toString会打印一条OK消息,但当它找到一个空间时,它会打印一些奇怪的东西,比如想要“z”(有时在我的IDE中看起来像一个块/正方形)。我宁愿说:“嘿,你忘了逗号!”
行号/列确实以[x.y]的形式打印出来。我实际上想显示[line:x,Column:y],因为人们会更直观地知道这是什么。
谢谢