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
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)
|
|
}
|
|
} |