Parser Combinators を使用して scala でパーサーを作成しようとしています。再帰的に一致する場合、
def body: Parser[Body] =
("begin" ~> statementList ) ^^ {
case s => { new Body(s); }
}
def statementList : Parser[List[Statement]] =
("end" ^^ { _ => List() } )|
(statement ~ statementList ^^ { case statement ~ statementList => statement :: statementList })
そうすれば、ステートメントに誤りがあるたびに、適切なエラーメッセージが表示されます。ただし、これは醜い長いコードです。だから私はこれを書きたい:
def body: Parser[Body] =
("begin" ~> statementList <~ "end" ) ^^ {
case s => { new Body(s); }
}
def statementList : Parser[List[Statement]] =
rep(statement)
このコードは機能しますが、FIRST ステートメントにエラーがある場合にのみ意味のあるメッセージを出力します。それが後のステートメントにある場合、パーサーは誤ったステートメント全体が「終了」トークンに置き換えられることを確認したいため、メッセージは非常に使用できなくなります。
Exception in thread "main" java.lang.RuntimeException: [4.2] error: "end" expected but "let" found
let b : string = x(3,b,"WHAT???",!ERRORHERE!,7 )
^
私の質問: repとrepsepを意味のあるエラー メッセージと組み合わせて動作させ、繰り返しフラグメントの先頭ではなく適切な場所にキャレットを配置する方法はありますか?