Pregunta

Supongamos que tengo un lenguaje ambiguo expresado en analizador combinador. ¿Hay una manera de hacer ciertas expresiones localmente codiciosos? He aquí un ejemplo de lo que quiero decir.

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, que puede funcionar de la siguiente manera:

$ scala Example 001111
[1.7] parsed: ((0~0)~List(1, 1, 1, 1))

Me gustaría algún modo indican a la primera parte de obj a ser localmente codicioso y coincidir con longchain. Si cambio el orden alrededor, que coincide con la longchain, pero eso no es debido a la avidez.

def obj: Parser[Any] = (longchain | shortchain) ~ anyrep
¿Fue útil?

Solución

Uso |||:

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) ))
  }
}

scala> Example.main(Array("001111"))
[1.7] parsed: ((((0~0)~1)~1)~List(1, 1))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top