2013-03-08 17 views
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屬性的順序?

+0

我不明白的問題。只需在等號前解析字符串,然後查看它是否正確。我認爲不需要'propA','propB'等。 – sschaef 2013-03-08 21:58:26

+0

有一個選擇組合符:'|'以及閉包:'*'(無限制),'+'(正數)。 ...「還有更多!」。 – 2013-03-08 22:08:19

+0

@sschaef也許這個片段很混亂。這就是我正在做的。我在等號前解析字符串以獲取所有屬性。最後,我根據讀取的屬性創建NodeA對象,這些屬性必須按特定的順序傳遞。我可以全部閱讀,但我怎樣才能保證他們順利通過? – Dan 2013-03-08 22:13:44

回答

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

這樣做。然後我可以在Node構造函數上處理這個。謝謝! – Dan 2013-03-08 22:37:37