Piszę parser, który dziedziczy z JavaTokenParsers w tym, że mam funkcję w następujący sposób:
import scala.util.parsing.combinator.lexical._
import scala.util.parsing._
import scala.util.parsing.combinator.RegexParsers;
import scala.util.parsing.combinator.syntactical.StdTokenParsers
import scala.util.parsing.combinator.token.StdTokens
import scala.util.parsing.combinator.lexical.StdLexical
import scala.util.parsing.combinator.lexical.Scanners
import scala.util.parsing.combinator.lexical.Lexical
import scala.util.parsing.input._
import scala.util.parsing.combinator.syntactical._
import scala.util.parsing.combinator.token
import scala.util.parsing.combinator._
class ParseExp extends JavaTokenParsers{
//some code for parsing
def parse(s:String) = {
val tokens = new lexical.Scanner(s)
phrase(expr)(tokens)
}
}
Otrzymuję następujący błąd:
type Scanner is not a member of package scala.util.parsing.combinator.lexical
[error] val tokens = new lexical.Scanner(s)
[error] ^
Dlaczego mam ten błąd podczas importowania wszystkich pakietów?
Odpowiedzi:
1 dla odpowiedzi № 1The JavaTokenParsers
nie implementuje Scanners
cecha. A więc aby uzyskać dostęp do tej klasy, musielibyście rozszerzyć tę cechę (lub cechę, która ją rozszerza).
Chyba że twój expr
parser akceptuje Reader
jako parametr (nie od jego metody stosowania), musisz "zastąpić" typ elementów i typ wejścia, jeśli "nie mylę się, aby to działało.
Czy jest jakiś powód, dla którego musisz mieć Reader[Token]
?
Jeśli nie potrzebujesz Reader[Token]
a ponieważ podajesz swoje wejście w zwykłym tekście,
phrase(expr)(new CharSequenceReader(s))
powinno działać.