1

我正在尝试在 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 添加到复合表达式中。我有一堂课

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

我本来以为我可以写...

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

但它不起作用。它说 word 是 Option[String] 类型和 String 类型的 quicktoken。我错过了什么?

4

1 回答 1

2

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

你想要(word <~ equals) ~ quicktoken,所以你需要提供括号。

于 2012-07-27T17:16:30.983 回答