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.

132 lines
2.9 KiB
Kotlin

package fr.celticinfo.lox
/**
* The ExprVisitor interface is used to visit the different types of expressions that can be parsed by the Parser.
*/
interface ExprVisitor<R> {
fun visitAssign(expr: Assign): R
fun visitBinary(expr: Binary): R
fun visitCall(expr: Call): R
fun visitGet(expr: Get): R
fun visitGrouping(expr: Grouping): R
fun visitLiteral(expr: Literal): R
fun visitLogical(expr: Logical): R
fun visitSet(expr: Set): R
fun visitSuper(expr: Super): R
fun visitThis(expr: This): R
fun visitUnary(expr: Unary): R
fun visitVariable(expr: Variable): 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 Assign(
val name: Token,
val value: Expr
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitAssign(this)
}
}
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 Call(
val callee: Expr,
val paren: Token,
val arguments: List<Expr>
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitCall(this)
}
}
data class Get(
val obj: Expr,
val name: Token
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitGet(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 Logical(
val left: Expr,
val operator: Token,
val right: Expr
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitLogical(this)
}
}
data class Set(
val obj: Expr,
val name: Token,
val value: Expr
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitSet(this)
}
}
data class Super(
val keyword: Token,
val method: Token
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitSuper(this)
}
}
data class This(
val keyword: Token
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitThis(this)
}
}
data class Unary(
val operator: Token, val right: Expr
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitUnary(this)
}
}
data class Variable(
val name: Token
) : Expr() {
override fun <R> accept(visitor: ExprVisitor<R>): R {
return visitor.visitVariable(this)
}
}