gpt4 book ai didi

parsing - 我如何使用 Scala 组合解析器抛出带有有意义消息的异常?

转载 作者:行者123 更新时间:2023-12-03 23:30:46 27 4
gpt4 key购买 nike

当语言不符合 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("\n")
val parseResult = parseAll(tables, source)
if(!parseResult.successful) {
throw new TestDataParseException(parseResult.toString)
}
}

toString 会打印一条 OK 消息,但是当它找到一个空格(有时在我的 IDE 中看起来像一个块/正方形)时,它会打印一些奇怪的东西,比如想要“\z”。我宁愿说,“嘿,你忘了逗号!”

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

谢谢

最佳答案

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))
}
}

关于parsing - 我如何使用 Scala 组合解析器抛出带有有意义消息的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3983276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com