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 regex
z "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.