Есть ли способ извлечь строку при разборе с помощью Scala комбинаторов? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть язык, который принимает подобные строки: !A(){assertion}. Я хочу, чтобы утверждение рассматривалось как строка без " ", что означает, что вместо assertion можно разместить что угодно. В настоящее время я использую комбинаторы синтаксического анализа в Scala, и для утверждения я использую функцию Regex, как показано ниже:

def regex ( r: Regex ): Parser[String] = new Parser[String] {
    def apply ( in: Input )
    = r.findPrefixMatchOf(in.source.subSequence(in.offset,in.source.length)) match {
      case Some(matched) =>
        Success(matched.group(1).toString, in.drop(in.offset+matched.end-1))
      case None => Failure("string matching regex `"+r+"' expected but "+in.first+" found",in)
    }
}

Однако у меня есть проблема, потому что функция сброса Input принимает как параметр количество элементов , которые должны быть отброшены с самого начала. Проблема в том, что количество элементов, извлекаемых функцией регулярных выражений, неизвестно.

Пример Если бы у меня было: !A(){num >= count} и, используя функцию регулярного выражения, я извлекаю num >= count, всего я бы извлек 3 элемента. Поэтому мне нужно удалить эти 3 элемента из ввода, то есть он должен вернуть: Success(matched.group(1).toString, in.drop(3)). Тем не менее, я не могу найти способ узнать количество элементов, которые должны быть удалены из ввода.

...