Я сделал лексер на основе Parsing M-Expressions in Scala with combinators.Добавление метода к унаследованному внутреннему классу
import scala.util.parsing.combinator.lexical._
import scala.util.parsing.combinator.token._
trait MyTokens extends Tokens {
case class Id(chars: String) extends Token
case class Num(chars: String) extends Token
}
class MyLexical extends Lexical with MyTokens {
def whitespace = rep(whitespaceChar)
def token: Parser[Token] = (
rep1(letter) ^^ { case charList => Id(charList mkString "") }
| rep1(digit) ^^ { case charList => Num(charList mkString "") }
)
}
object Main extends App {
val lexical = new MyLexical
val scanner = new lexical.Scanner("abc012def345")
def tokenList(s: lexical.Scanner): List[lexical.Token] =
if (s.atEnd) Nil
else s.first :: tokenList(s.rest)
println(tokenList(scanner))
}
Он работал хорошо в результате List(Id(abc), Num(012), Id(def), Num(345))
. Тем не менее, функция tokenList
должна быть методом Сканера, чтобы назвать ее scanner.tokenList
. Чтобы достичь этого, кажется, что внутренний класс MyLexical.Scanner
следует переоценить. Является ли это возможным? Если сможешь, как это сделать?
Я получил ошибки 'не найдено: значение MyLexical', так что я не определен' BetterScanner' и 'tokenList' с не аргументы в «MyLexical» и «import lexical._', тогда это сработало. –