2015-06-09 70 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'中,並且'輸入lexical._',然後它就起作用了。 –