我在这里阅读了一些关于 Scala 解析器组合器和更好的错误处理的帖子,但是很多“解决方案”似乎都说“只使用'~!'”或“使用语法规则预测失败案例”。
所以我尝试实施其中的一些建议,但我无法理解失败/错误解析器的工作原理:
val foo: Parser[String] = """foo""".r | err("Custom Message")
val test: Parser[List[String]] = repsep(foo, ",") | err("Custom Message Repsep")
val r = parseAll(foo, ""bar") //[1.1] error: Custom Message -- YAY
val r = parseAll(test, "foo, bar") //[1.2] failure: string matching regex `foo' expected but `b' found -- NOOOOOO
我的问题基本上是:如果foo
因为 被反复尝试对输入字符串进行尝试repsep
,那么为什么 - 因为它的定义包括一个|
on failure to try and force an err
- 来自生产中最左边的终端的错误消息foo
被显示?
有没有办法在解析结果中查看一堆错误消息并始终找到我的并显示给用户?还是我需要实现我自己的版本repsep
或什么?我相信我错过了关于正在发生的事情的概念模型的一些东西:(