/ / Como analisar essa estrutura: “name [arg, arg]” com analisadores scala combinator? - parsing, scala, parser-combinators

Como analisar essa estrutura: “name [arg, arg]” com analisadores scala combinator? - parsing, scala, parser-combinators

Eu tenho várias seqüências como estas:

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

Eu queria analisá-lo com analisadores scala combinator, e isso é o melhor que consegui:

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 em name, mas não consegue trabalhar name[arg] - diz string matching regexz "esperado mas [" found. É possível consertar isso?

Respostas:

4 para resposta № 1

@TonyK já deu a resposta em seu comentário. Mas quero sugerir que os combinadores do analisador Scala já podem analisar valores opcionais:

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

Com ~> e <~ é possível manter apenas o resultado da esquerda ou da direita para evitar correspondência de padrão desnecessária em ^^. Além disso, eu usaria aspas triplas para seqüências de caracteres para evitar muita fuga.


2 para resposta № 2

Eu acho que pode funcionar se você virar o jogo ... O nome está sendo sugado pela primeira regra, e então você tem uma falha na entrada.