我在使用一種特質時從另一個特性中的方法返回的解析器遇到問題。編譯器抱怨類型不匹配,在我看來,問題是由於路徑依賴類。我不知道如何得到我想要的。由路徑依賴類型挫敗
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)
我排序的得到的想法:每個「東西」方法定義語法分析器類型,其路徑是特定的封裝類(Outerparser或Innerparser)。 Outerparser的「quoted」方法需要一個類型爲Outerparser.this.Parser的實例,但得到的是Innerparser#Parser。
我喜歡能夠使用從此類或其他類獲得的解析器引用。我怎樣才能做到這一點?
我不想把我所有的解析代碼放到同樣的範圍內。任何其他想法? – Ladlestein