как выкинуть исключения со значимыми сообщениями с помощью парсера комбинации скала? - PullRequest
6 голосов
/ 21 октября 2010

Я хотел бы выдать исключение, когда язык не соответствует грамматике для синтаксического анализатора комбинации scala.Вот пример правила:

def record: Parser[Record] = "-" ~ opt(recordLabel) ~ repsep(column, ",") ^^ {
    case "-" ~ label ~ columns => new Record(label, columns)
}

Допустим, в части repsep (column, ",") они случайно создают строку, подобную этой

a, b, c, d,

Это недопустимопотому что это заканчивается ",", который не должен быть там.Вместо того, чтобы синтаксический анализатор просто останавливался, когда вы вызываете parseAll (), как сделать так, чтобы это выдавало значимое исключение, которое читается человеком?(Настраиваемый текст, номер строки и т., но он печатает странные вещи, такие как «\ z», когда вместо этого находит пробел (который иногда выглядит как блок / квадрат в моей IDE).Я бы лучше сказал: «Эй, ты забыл запятую!»

Номера строк / столбцы выводятся в виде [xy].Я действительно хотел бы показать [Строка: x, Столбец: y], потому что люди будут знать, что это более интуитивно.

Спасибо

1 Ответ

7 голосов
/ 21 октября 2010
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))
  }
}
...