val uninterestingthings = ".".r
val parser = "(?ui)(regexvalue)".r | (uninterestingthings~>parser)
Этот рекурсивный синтаксический анализатор попытается разобрать «(? Ui) (regexvalue)». R до конца ввода. Есть ли в scala способ запретить синтаксический анализ, когда определенное количество символов было уничтожено «неинтересными»?Расширенный контроль рекурсивного анализатора в scala
UPD: У меня есть одно плохое решение:
object NonRecursiveParser extends RegexParsers with PackratParsers{
var max = -1
val maxInput2Consume = 25
def uninteresting:Regex ={
if(max<maxInput2Consume){
max+=1
("."+"{0,"+max.toString+"}").r
}else{
throw new Exception("I am tired")
}
}
lazy val value = "itt".r
def parser:Parser[Any] = (uninteresting~>value)|parser
def parseQuery(input:String) = {
try{
parse(parser, input)
}catch{
case e:Exception =>
}
}
}
Недостатки:
- не все члены ленивые Vals так PackratParser будет иметь какое-то время штраф
- строительство регэкспы на каждом «неинтересной» вызов метода - штраф времени
- с использованием исключения для программы управления - стиль кода и штраф времени
Как бы вы решили эту проблему с другими библиотеками-анализаторами, генераторами или фреймворками? –
Что вы на самом деле пытаетесь сделать? –