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