0

我有一个处理自定义属性文件的正则表达式解析器。在我的文件中,我具有以下结构:

...
[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 回答