2008-11-02 62 views
6

我做礁HORSTMANN的組合符解析器練習,我想知道的是代表數字和代表在比賽聲明變量字符串字符串來區分的最好方式:斯卡拉組合子解析器 - 數字字符串和變量字符串區分

def factor: Parser[ExprTree] = (wholeNumber | "(" ~ expr ~ ")" | ident) ^^ { 
    case a: wholeNumber => Number(a.toInt) 
    case a: String => Variable(a) 
} 

那裏的第二行「case a:wholeNumber」不合法。我想過一個正則表達式,但還沒有找到一種方法讓它與「case」一起工作。

回答

6

我會將它分開一點,並將案例分析推入|。這是一個組合程序,真正LL(*)解析的一般優勢之一:

def factor: Parser[ExprTree] = (wholeNumber ^^ { Number(_.toInt) } 
           | "(" ~> expr <~ ")" 
           | ident ^^ { Variable(_) }) 

我道歉,如果你不熟悉的下劃線語法。基本上,它只是意味着「用參數代替 th參數到封閉函數值」。因此{ Variable(_) }相當於{ x => Variable(x) }

此處的另一點語法魔術是~><~運營商取代~。這些運算符意味着該術語的解析應包括兩個parens的語法,但結果應完全由expr的結果確定。因此,"(" ~> expr <~ ")""(" ~ expr ~ ")"完全相同,但它不需要額外的案例分析即可從expr中檢索內部結果值。

+0

非常好!因爲我得到了「錯誤:缺少擴展函數的參數類型」,所以必須將{Number(_。toInt)}更改爲{x:String => Number(x)},然後它就像魅力一樣工作。 仍然好奇,如果有一個案例類的方式來解決它雖然。 – 2008-11-03 07:15:53

相關問題