/ / Jak utworzyć leksem.Scanner w klasie JavaTokenParsers? - scala, parsowanie, analiza leksykalna

Jak utworzyć leksem.Scanner w klasie JavaTokenParsers? - scala, parsowanie, analiza leksykalna

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 № 1

The 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ć.