У меня есть язык, который принимает подобные строки: !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))
. Тем не менее, я не могу найти способ узнать количество элементов, которые должны быть удалены из ввода.