val uninterestingthings = ".".r
val parser = "(?ui)(regexvalue)".r | (uninterestingthings~>parser)
Dieser rekursive Parser versucht, "(? Ui) (regexvalue)". R bis zum Ende der Eingabe zu analysieren. Gibt es in scala eine Möglichkeit, das Parsen zu verhindern, wenn eine bestimmte Anzahl von Zeichen von "uninteressanthings" verbraucht wurde?Erweiterte Kontrolle des rekursiven Parsers in der Skala
UPD: Ich habe eine schlechte Lösung:
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 =>
}
}
}
Nachteile:
- nicht alle Mitglieder sind faul vals so PackratParser einige Zeit Strafe
haben - regexps auf jedem "uninteressant" Methodenaufruf Konstruktion - Zeitstrafe
- Verwenden von Ausnahme zu Programm - Code-Stil und Zeitstrafe
Wie würden Sie dieses Problem mit anderen Parser-Bibliotheken, Generatoren oder Frameworks lösen? –
Was versuchst du eigentlich zu tun? –