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 に答える