2013-09-11 3 views
0

Here are the errors я получил при запуске sbt run на этом перечислении [3,5] из [1]:Типы шаблонов, не работающих в Scala?

import util.parsing.combinator.JavaTokenParsers 

trait ArithParser extends JavaTokenParsers { 
    type T 
    def expr: Parser[T] = chainl1(term, "+" ^^^ Add | "-" ^^^ Sub) 
    def term   = chainl1(factor, "*" ^^^ Mul | "/" ^^^ Div) 
    def factor   = floatingPointNumber ^^ Num | "(" ~> expr <~ ")" 

    def Add = (T,T) => T 
    def Sub = (T,T) => T 
    def Mul = (T,T) => T 
    def Div = (T,T) => T 
    def Num = String => T 
} 

trait DirectEvaluation { 
    type T = Double 
    val Add = (_: Double) + (_:Double) 
    val Sub = (_: Double) - (_:Double) 
    val Mul = (_: Double) * (_:Double) 
    val Div = (_: Double)/(_:Double) 
    val Num = (_: String).toDouble 
} 

trait ASTBuilding { 
    type T = Expr 
    sealed abstract class Expr 

    case class Add(e1: Expr, e2: Expr) extends Expr 
    case class Sub(e1: Expr, e2: Expr) extends Expr 
    case class Mul(e1: Expr, e2: Expr) extends Expr 
    case class Div(e1: Expr, e2: Expr) extends Expr 
    case class Num(e: String) extends Expr 
} 

object Interpreter extends ArithParser with DirectEvaluation 
object Compiler extends ArithParser with ASTBuilding 

object Main extends ArithParser { 
    def main(args: Array[String]) { 
     val defArgs = if (args.isEmpty) Array("10.5 - 4*2") else args 
     val parser: ArithParser = if(defArgs.head === "eval") { 
       println("Interpreter!"); Interpreter 
      } else { 
       println("Compiler!"); Compiler 
      } 
     defArgs.tail foreach {arg => 
      println("Input: " + arg) 
      println("Output: " + parseAll(parser.expr, arg)) 
     } 
    } 
} 

[1]E. Labun, “Combinator Parsing in Scala,” Technische Hochschule Mittelhessen, 2012.

Как исправить эти ошибки?

ответ

1

(T,T) => T является аннотацией типа, поэтому вам необходимо заменить = на :.

def Add: (T,T) => T 

Точно также, как это делается в диссертации, на которую вы ссылаетесь.

=== также не существует в списке, это всего лишь ==.

И вы должны вызвать parseAll на парсер:

parser.parseAll(...) 

Мне кажется, что вам не хватает основы программирования Scala, в противном случае вы могли бы легко исправить эти ошибки сами. Мой совет, прочитайте хорошую книгу scala, чтобы получить базовое понимание языка, прежде чем начинать с продвинутых тем.

+0

Обязательно я попытался скопировать и вставить код непосредственно в один момент моей отладки, что не помогло устранить проблему. Во всяком случае, то, что вы указали, это глупые ошибки, угадать 3 дня без сна увеличивает частоту такого>. <. Приветствия. –

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