Pregunta

Parece que los combinadores analizadores de Scala no retroceden. Tengo una gramática (ver fondo) que no puede analizar el siguiente "STMT" correctamente:

copy in to out .

Eso debería ser fácil de analizar con el retroceso:

stmt: (to out(copy in))

¿O me estoy perdiendo algo?

Analizador:

type ExprP = Parser[Expr]
type ValueP = Parser[ValExpr]
type CallP = Parser[Call]
type ArgsP = Parser[Seq[Expr]]

val ident     = "[a-zA-Z\\+\\-\\*/%><\\\\\\=]+".r
val sqstart   = "\\["                          .r
val sqend     = "\\]"                          .r
val del       = ","                            .r
val end       = "\\."                          .r

def stmt: ExprP      = expr <~ end
def expr: ExprP      = ucall | call | value
def value: ValueP    = ident ^^ {str => IdentExpr(str)}
def call: CallP      = (args ~ ident ~ expr) ^^ {case args ~ method ~ upon => Call(args, method, upon)}
def ucall: CallP     = (ident ~ expr) ^^ {case method ~ upon => Call(Seq(), method, upon)}
def args: ArgsP      = advargs | smplargs
def smplargs: ArgsP  = expr ^^ {e => Seq(e)}
def advargs: ArgsP   = (sqstart ~> repsep(expr, del) <~ sqend) ^^ {seq => seq}
¿Fue útil?

Solución

Quieres usar PackratParsers en 2.8. Creo que el analizador Packrat es el único analizador de retroceso.

Editar: a mediados de año 2015, debe usar parada rápida en cambio. No solo es mucho más rápido, sino también más fácil de usar (especialmente cuando se crea estructuras de datos a partir del análisis).

Otros consejos

Su problema no es retroceder. El estandar | operador en scala.util.parsing.combinator hará retroceso. Su problema es la recursión a la izquierda (exprcallargssmplargsexpr). El análisis de Packrat puede ayudar con eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top