2015-06-09 2 views
0

Я сделал лексер на основе 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 следует переоценить. Является ли это возможным? Если сможешь, как это сделать?

ответ

1

Я не думаю, что вы можете добавить метод во внутренний класс, но вы можете использовать неявное преобразование для достижения аналогичного результата. Это будет выглядеть следующим образом:

object ScannerImplicits { 
    implicit class BetterScanner(scanner: MyLexical.Scanner) { 
     def tokenList(s: MyLexical.Scanner): List[MyLexical.Token] = { 
     if (s.atEnd) Nil 
     else s.first :: tokenList(s.rest) 
     } 
    } 
} 

Чем вы будете в состоянии написать

import ScannerImplicits ._ 
new lexical.Scanner("abc012def345").tokenList 
+0

Я получил ошибки 'не найдено: значение MyLexical', так что я не определен' BetterScanner' и 'tokenList' с не аргументы в «MyLexical» и «import lexical._', тогда это сработало. –

Смежные вопросы