scala: помощь парсера - PullRequest
       6

scala: помощь парсера

3 голосов
/ 27 сентября 2010

Я учусь писать простой парсер-комбинатор.Я пишу правила снизу вверх и пишу юнит-тесты для проверки на ходу.Однако я не могу использовать repsep () с пробелами в качестве разделителя.

object MyParser extends RegexParsers {
  lazy val listVal:Parser[List[String]]=elem('{')<~repsep("""\d+""".r,"""\s+""".r)~>elem('}')
}

Правило было упрощено, чтобы проиллюстрировать проблему.Когда я передаю парсеру «{1 2 3}», он всегда жалуется, что он не совпадает:

[1.4] ошибка: `} 'ожидается, но найдено 2

Мне интересно, как правильно написать правило, как я описал?

Спасибо

1 Ответ

6 голосов
/ 27 сентября 2010

По умолчанию парсеры, полученные из RegexParsers, пропускают пробелы перед попыткой сопоставления с любым символом терминала. Если ваша интерпретация пробелов не является необычной, вы можете просто работать с этим. Если конкретный символ (последовательности), который вы хотите рассматривать как пропущенный пробел, отличается от значения по умолчанию (\s+), вы можете переопределить проецируемое значение val whiteSpace: Regex = ... в вашем анализаторе RegexParsers. Если вы не делаете никаких пропусков, override def skipWhitespace = false.

Редактировать: Так что да, изменив это:

repsep("""\d+""".r,"""\s+""".r)

к этому:

rep("""\d+""".r)

и оставляя все остальное, определенное в RegexParsers без изменений, следует делать то, что вы хотите.

Кстати, обычное использование repsep предназначено для таких вещей, как списки, разделенные запятыми, в которых нужно убедиться, что запятые есть, но не нужно хранить их в результирующем дереве анализа (или AST). 1020 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...