【发布时间】:2012-09-19 01:22:11
【问题描述】:
在一个 trait 中,我在使用从另一个 trait 中的方法返回的 Parser 时遇到问题。编译器抱怨类型不匹配,在我看来问题是由于路径相关的类。我不知道如何得到我想要的。
trait Outerparser extends RegexParsers {
def inner: Innerparser
def quoted[T](something: Parser[T]) = "\"" ~> something <~ "\""
def quotedNumber = quoted(inner.number) // Compile error
def quotedLocalNumber = quoted(number) // Compiles just fine
def number: Parser[Int] = ("""[1-9][0-9]*"""r) ^^ {str => str.toInt}
}
trait Innerparser extends RegexParsers {
def number: Parser[Int] = ("""[1-9][0-9]*"""r) ^^ {str => str.toInt}
}
还有错误:
[error] /Path/to/MyParser.scala:6: type mismatch
[error] found : minerals.Innerparser#Parser[Int]
[error] required: Outerparser.this.Parser[?]
[error] def quotedNumber = quoted(inner.number)
我有点明白了:每个“某事”方法都定义了一个 Parser 类型,其路径特定于封闭类(Outerparser 或 Innerparser)。 Outerparser 的“引用”方法需要一个 Outerparser.this.Parser 类型的实例,但正在获取 Innerparser#Parser。
我希望能够使用从此类或其他类获得的解析器引用。我该怎么做?
【问题讨论】:
标签: scala parser-combinators path-dependent-type