/ / ¿Cómo analizar esta estructura: “nombre [arg, arg]” con analizadores combinadores de scala? - análisis, scala, parser-combinators

Cómo analizar esta estructura: "nombre [arg, arg]" con los analizadores scala combinator? - Analizadores de análisis, scala y analizador

Tengo varias cuerdas como estas:

name[arg,arg,arg]
name[arg,arg]
name[arg]
name

Quería analizarlo con analizadores combinadores de Scala, y esto es lo mejor que logré:

object TaskDepParser extends JavaTokenParsers {
def name: Parser[String] = "[^\[\],]+".r
def expr: Parser[(String, Option[List[String]])] =
name ^^ { a => (a, None) } |
name ~ "[" ~ repsep(name, ",") ~ "]" ^^ { case name~_~args~_ => (name, Some(args)) }
}

Funciona en name, pero no funciona en name[arg] - dice string matching regexz "esperado pero [" found. ¿Es posible arreglarlo?

Respuestas

4 para la respuesta № 1

@TonyK ya ha dado la respuesta en su comentario. Pero quiero sugerir que los combinadores de analizador de Scala ya pueden analizar valores opcionales:

object TaskDepParser extends JavaTokenParsers {
def name: Parser[String] = """[^[],]+""".r
def expr: Parser[(String, Option[List[String]])] =
name ~ opt("[" ~> repsep(name, ",") <~ "]") ^^ { case name ~ args => (name, args) }
}

Con ~> y <~ es posible mantener solo el resultado a la izquierda o derecha para evitar la coincidencia innecesaria de patrones en ^^. Además, usaría comillas triples para las cuerdas para evitar muchas escapadas.


2 para la respuesta № 2

Creo que podría funcionar si lo volteas ... La primera regla te chupa el nombre y luego te falla la entrada.