val uninterestingthings = ".".r
val parser = "(?ui)(regexvalue)".r | (uninterestingthings~>parser)
Ten rekursywny analizator składni będzie próbował przeanalizować "(? Ui) (regexvalue) .r r aż do końca wprowadzania. Czy w scala jest sposób na zabranianie analizowania, gdy pewna określona liczba znaków została skonsumowana przez "nieinteresujące rzeczy"?Zaawansowane sterowanie parser rekursywny w scala
UPD: Mam jedno słabe rozwiązanie:
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 =>
}
}
}
Wady:
- nie wszyscy członkowie są leniwe vals tak PackratParser będzie miał trochę czasu kara
- konstruowaniu wyrażeń regularnych na każdym „nieciekawe” metody połączenia - kara czasowa
- używanie wyjątku do programu sterującego - styl kodowy i kara czasowa
Jak rozwiązać ten problem z innymi bibliotekami parsera, generatorami lub frameworkami? –
Co właściwie próbujesz zrobić? –