Я пытаюсь написать парсер в Scala, используя Parser Combinators.Если я сопоставлю рекурсивно,
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.Если это в более позднем утверждении, сообщение становится болезненно непригодным для использования, потому что синтаксический анализатор хочет, чтобы весь ошибочный оператор был заменен маркером «end»:
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 , работающие в сочетании со значимыми сообщениями об ошибках, которые помещают курсор в нужном месте, а не в начале повторяющегося фрагмента?