1

我有几个这样的字符串:

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。有可能修复它吗?

4

2 回答 2

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

~>并且可以只保留左或右结果以<~避免不必要的模式匹配^^。此外,我会为字符串使用三引号以避免大量转义。

于 2012-09-05T08:38:17.823 回答
2

我认为如果你翻转它可能会起作用......名称被第一条规则所吸引,然后你输入失败。

于 2012-09-05T15:17:48.700 回答