ここで 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
、その定義には|
試行と強制の失敗が含まれているため、プロダクション err
の左端の端末からのエラーメッセージが表示されているのはなぜですか?foo
解析結果のエラー メッセージのスタックを表示し、常に自分のものを見つけてユーザーに表示する方法はありますか? または、独自のバージョンのrepsep
または何かを実装する必要がありますか? 何が起こっているかの概念モデルについて何かが欠けていると思います:(