2013-05-31 59 views
0

解析一些複雜的文本時,我需要爲了重用和可讀性原因而拆分出正則表達式定義,但似乎經常會以此一般結構的Scala代碼結束(pn-正則表達式模式,vn一個變量):解析器組合器中的不雅結構重複

val cp1 = p1 ~ p2 ~ p3 ~ p4 ~ p5 ~ p6 ^^ 
      case { dummy1 ~ v2 ~ dummy3 ~ v4 ~ dummy5 ~ v6 => ACaseClass(v2, v4, v6) } 

最明顯的問題是可讀性和代碼的可維護性作爲新圖案需要,因爲從佔位符酮(dummyn)的有用匹配(vn)的分離的插入。

那麼,有沒有更好的方式來表達意圖?我可以每dummyn改用_嗎?

在SNOBOL語言中,可以編寫(pat . var)(pat $ var)將匹配結果賦予變量;同樣,在最新的正則表達式語法中,我們命名了捕獲組(?P<name>pat)。其目的很明顯是保持匹配捕獲變量接近模式。

所以,我想編寫是沿着一般路線的東西:

val cp1 = p1 ~ (p2 $$ v2) ~ p3 ~ (p4 $$ v4) ~ p5 ~ (p6 $$ v6) $=> 
      ACaseClass(v2, v4, v6) 

顯然我假設某種新的運營商$$$=>這使這個簡單的語法。

可以想象宏可以提供幫助,但它們目前超出了我的能力。任何輸入歡迎!

回答

2

你爲什麼不嘗試使用_?事實證明,它的工作原理。您也可以使用~><~放棄部分模式,但如果您想放棄內部零件,則需要使用圓括號。

object SimpleScala extends JavaTokenParsers { 

    def test = "(" ~> wholeNumber ~ ("," ~> wholeNumber <~ ",") ~ wholeNumber <~ ")" ^^ 
    { case i1 ~ i2 ~ i3 => (i1,i2,i3) } 

    def test2 = "(" ~ wholeNumber ~ "," ~ wholeNumber ~ ")" ^^ 
    { case _ ~ i1 ~ _ ~i2 ~ _ => (i1,i2) } 

    def main(args: Array[String]){ 
    println(parseAll(test,"(42,34,5)")) 
    println(parseAll(test2,"(42,345)")) 
    } 
}