Search code examples
parsingscalaparser-combinators

How to parse this structure: "name[arg,arg]" with scala combinator parsers?


I have several strings like these:

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

I wanted to parse it with scala combinator parsers, and this is the best that I managed to get:

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

It works on name, but fails to work on name[arg] - says string matching regex\z' expected but [' found. Is it possible to fix it?


Solution

  • @TonyK has already given the answer in his comment. But I wanna suggest that Scala parser combinators can already parse optional values:

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

    With ~> and <~ it is possible to keep only left or right result to avoid unnecessary patter matching in ^^. Furthermore I would use triple quotes for strings to avoid lots of escaping.