如何解析Scala中的类型

时间:2012-07-27 16:21:48

标签: scala parser-combinators

我正在尝试在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。我错过了什么?

1 个答案:

答案 0 :(得分:2)

另一个优先问题:a <~ b ~ c被解释为a <~ (b ~ c),而不是(a <~ b) ~ c。这是因为以<开头的中缀运算符的优先级低于以~开头的运算符(请参阅the language specification的6.12.3中的列表)。

您需要(word <~ equals) ~ quicktoken,因此您需要提供括号。