Como devo implementar “adicionar” interpretador no scala?
Sep 27 2020
Estou implementando o intérprete scala e tenho alguns problemas
Eu tenho a classe de valor conforme seguido em Value.scala:
case class IntV(value: Int) extends Value
Também acompanhei a aula em arquivo Expr.scala:
case class IntE(value: Int) extends Expr
case class Add(left: Expr, right: Expr) extends Expr
Quando implementei o intérprete Int da seguinte forma:
case IntE(value)=>IntV(value)
Funcionou bem, mas quando implementei o intérprete de adição (que faz a adição como 3 + 4 = 7) da seguinte forma:
case Add(left, right)=>IntV(left)+IntV(right)
Ele retorna um erro que diz para a variável esquerda e direita, ele requer, Intmas foi encontrado expr.
O que eu fiz errado? O que devo fazer para obter a devolução correta?
Respostas
3 DmytroMitin Sep 27 2020 at 14:31
Você deve chamar o intérprete recursivamente.
Por exemplo
sealed trait Value
case class IntV(value: Int) extends Value
sealed trait Expr
case class IntE(value: Int) extends Expr
case class Add(left: Expr, right: Expr) extends Expr
def interpret(expr: Expr): Value = expr match {
case IntE(value) => IntV(value)
case Add(left, right) => (interpret(left), interpret(right)) match {
case (IntV(v1), IntV(v2)) => IntV(v1 + v2)
}
}
interpret(IntE(1)) // IntV(1)
interpret(Add(IntE(3), IntE(4))) // IntV(7)
Ou com um método definido +paraIntV
sealed trait Value
case class IntV(value: Int) extends Value {
def +(other: IntV): IntV = IntV(value + other.value)
}
sealed trait Expr
case class IntE(value: Int) extends Expr
case class Add(left: Expr, right: Expr) extends Expr
def interpret(expr: Expr): Value = expr match {
case IntE(value) => IntV(value)
case Add(left, right) => (interpret(left), interpret(right)) match {
case (v1: IntV, v2: IntV) => v1 + v2
}
}
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
Christopher Nolan uma vez se arrependeu de ter lido o 'roteiro de Pulp Fiction' de Quentin Tarantino