2012-07-27 83 views
1

我想在Scala中編寫一個解析器,逐漸建立一個具體的類型層次結構。我開始於:如何解析爲Scala中的某個類型

private def word = regex(new Regex("[a-zA-Z][a-zA-Z0-9-]*")) 
private def quicktoken: Parser[Quicktoken] = "/" ~> word <~ "/" <~ (space?) ^^ { new Quicktoken(_) } 

這很好。/hello /將被解析爲一個quicktoken

現在我想將quicktoken添加到複合表達式。我有一個類

class MatchTokenPart(word:String,quicktoken:RewriteWord){ 
} 

我本來以爲我可以寫...

private def matchTokenPartContent: Parser[MatchTokenPart] = word<~equals~quicktoken ^^ { case word~quicktoken => new MatchTokenPart(word, quicktoken)} 

,但它不工作。它表示這個單詞是類型爲Option [String]的類型,以及類型爲String的quicktoken。我錯過了什麼?

回答

2

另一個優先問題:a <~ b ~ c被解釋爲a <~ (b ~ c)而不是(a <~ b) ~ c。這是因爲以<開頭的中綴算子優先於以~開頭的中綴算子(參見the language specification的6.12.3中的列表)。你需要(word <~ equals) ~ quicktoken,所以你需要提供圓括號。