package fr.celticinfo.lox interface ExprVisitor { 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 accept(visitor: ExprVisitor): R } data class Binary( val left: Expr, val operator: Token, val right: Expr ) : Expr() { override fun accept(visitor: ExprVisitor): R { return visitor.visitBinary(this) } } data class Grouping( val expression: Expr ) : Expr() { override fun accept(visitor: ExprVisitor): R { return visitor.visitGrouping(this) } } data class Literal( val value: Any ) : Expr() { override fun accept(visitor: ExprVisitor): R { return visitor.visitLiteral(this) } } data class Unary( val operator: Token, val right: Expr ) : Expr() { override fun accept(visitor: ExprVisitor): R { return visitor.visitUnary(this) } }