하나의 특성에서 다른 특성의 메서드에서 반환 된 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)
I 정렬의 아이디어를 얻을 : 각 "뭔가"방법은 그 경로 둘러싸는 클래스 (Outerparser 또는 Innerparser)에 특정한 파서 유형을 정의한다. Outerparser의 "quoted"메소드는 Outerparser.this.Parser 유형의 인스턴스를 기대하지만 Innerparser # Parser를 얻습니다.
나는이 클래스 또는 다른 클래스에서 얻은 파서에 인용 부호를 사용할 수 있기를 좋아합니다. 어떻게해야합니까?
나는 모든 파싱 코드를 같은 범위에 넣고 싶지 않습니다. 다른 아이디어? – Ladlestein