Scala: ¿Puedo empujar un analizador combinador a ser localmente codiciosos?
-
24-09-2019 - |
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
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