You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
1.1 KiB
Kotlin

package fr.celticinfo.lox
interface ExprVisitor<R> {
fun visitBinary(binary: Binary): R
fun visitGrouping(grouping: Grouping): R
fun visitLiteral(literal: Literal): R
fun visitUnary(unary: Unary): R
}
/**
* The Expr class represents the different types of expressions that can be parsed by the Parser.
*/
sealed class Expr {
abstract fun <R> accept(visitor: ExprVisitor<R>): R
}
data class Binary(
val left: Expr, val operator: Token, val right: Expr
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitBinary(this)
}
}
data class Grouping(
val expression: Expr
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitGrouping(this)
}
}
data class Literal(
val value: Any
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitLiteral(this)
}
}
data class Unary(
val operator: Token, val right: Expr
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitUnary(this)
}
}