如何解析这个结构:用scala组合器解析器命名“name [arg,arg]”?

时间:2012-09-05 05:57:28

标签: parsing scala parser-combinators

我有几个这样的字符串:

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

我想用scala组合器解析器解析它,这是我设法得到的最好的:

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

适用于name,但无法在name[arg]上工作 - 说string matching regex \ z'预计会[' found。有可能解决它吗?

2 个答案:

答案 0 :(得分:4)

@TonyK已在评论中给出答案。但我想建议Scala解析器组合器已经可以解析可选值:

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

使用~><~,可以仅保留左侧或右侧结果,以避免^^中不必要的模式匹配。此外,我会使用三重引号来避免大量的转义。

答案 1 :(得分:2)

我认为如果你翻转它可能会有效......名字会被第一条规则搞砸,然后输入就会失败。