Supongamos que tengo un lenguaje ambiguo expresado en el analizador combinador. ¿Hay alguna forma de hacer que ciertas expresiones sean codiciosas localmente? Aquí hay un ejemplo de lo que quiero decir.Scala: ¿Puedo empujar un analizador combinador para que sea localmente codicioso?
import scala.util.parsing.combinator._
object Example extends JavaTokenParsers {
def obj: Parser[Any] = (shortchain | longchain) ~ anyrep
def longchain: Parser[Any] = zero~zero~one~one
def shortchain: Parser[Any] = zero~zero
def anyrep: Parser[Any] = rep(any)
def any: Parser[Any] = zero | one
def zero: Parser[Any] = "0"
def one: Parser[Any] = "1"
def main(args: Array[String]) {
println(parseAll(obj, args(0)))
}
}
Después de compilar, puedo ejecutarlo de la siguiente manera:
$ scala Example 001111
[1.7] parsed: ((0~0)~List(1, 1, 1, 1))
me gustaría dar instrucciones de alguna manera la primera parte de obj
a ser localmente codiciosos y combinar con longchain
. Si cambio el orden, coincide con el longchain
, pero eso no se debe a la codicia.
def obj: Parser[Any] = (longchain | shortchain) ~ anyrep
La noción de "avidez" sólo se aplica a cierre ('rep' o la postifx' * 'operador) y en su gramática que sólo se aplica a la parte siguiente '(longchain | shortchain)' o '(shortchain | longchain)'. –