0

カスタム プロパティ ファイルを処理する Regex パーサーがあります。私のファイルには、次の構造があります。

...
[NodeA]
propA=val1
propB=val2
propC=val3

[NodeB]
...

NodeA を処理するパーサーを次のように定義しました。

lazy val parserA: Parser[String] = "propA" ~> "=" ~> mPropA 
lazy val parserB: Parser[String] =  
...

lazy val nodeA: Parser[NodeA] = "[" ~> "NodeA" ~> "]" ~> parserA ~> parserB ~> parserB ^^ { 
   case iPropA ~ iPropB ~ iPropC => new NodeA(iPropA, iPropB, iPropC)
}

これはそのままで問題なく動作します。問題は、NodeA のプロパティの順序が異なる場合です。この場合、解析エラーが発生します。例えば:

[NodeA]
propC=val3
propA=val1
propB=val2

NodeA のプロパティの指定されていない順序を受け入れるようにパーサーを定義する方法はありますか?

4

1 に答える 1

2

それでも私はあなたの問題を理解していないと感じていますが、どうですか?

import scala.util.parsing.combinator.JavaTokenParsers

object Test extends App with JavaTokenParsers {

  case class Prop(name: String, value: String)
  case class Node(name: String, propA: Prop, propB: Prop, propC: Prop)

  lazy val prop = (ident <~ "=") ~ ident ^^ {
    case p ~ v => (p, v)
  }

  lazy val node = "[" ~> ident <~ "]"

  lazy val props = repN(3, prop) ^^ {
    _.sorted map Prop.tupled
  }

  lazy val nodes = rep(node ~ props) ^^ {
    _ map { case node ~ List(a, b, c) => Node(node, a, b, c) }
  }

  val in =
"""[NodeA]
propA=val1
propB=val2
propC=val3

[NodeB]
propC=val3
propA=val1
propB=val2"""

  println(parseAll(nodes, in))
}
于 2013-03-08T22:19:05.517 に答える