package fr.celticinfo.lox /** * The StmtVisitor interface is used to visit the different types of statements that can be parsed by the Parser. */ interface StmtVisitor { fun visitBlock(stmt: Block): R fun visitClassStmt(stmt: ClassStmt): R fun visitExpression(stmt: Expression): R fun visitFunction(stmt: Function): R fun visitIf(stmt: If): R fun visitPrint(stmt: Print): R fun visitReturn(stmt: Return): R fun visitVar(stmt: Var): R fun visitWhile(stmt: While): R } /** * The Stmt class represents the different types of statements that can be parsed by the Parser. */ sealed class Stmt { abstract fun accept(visitor: StmtVisitor): R } data class Block( val statements: List ) : Stmt() { override fun accept(visitor: StmtVisitor): R { return visitor.visitBlock(this) } } data class ClassStmt( val name: Token, val superClass: Variable?, val methods: List ) : Stmt() { override fun accept(visitor: StmtVisitor): R { return visitor.visitClassStmt(this) } } data class Expression( val expression: Expr ) : Stmt() { override fun accept(visitor: StmtVisitor): R { return visitor.visitExpression(this) } } data class Function( val name: Token, val params: List, val body: List ) : Stmt() { override fun accept(visitor: StmtVisitor): R { return visitor.visitFunction(this) } } data class If( val condition: Expr, val thenBranch: Stmt, val elseBranch: Stmt? ) : Stmt() { override fun accept(visitor: StmtVisitor): R { return visitor.visitIf(this) } } data class Print( val expression: Expr ) : Stmt() { override fun accept(visitor: StmtVisitor): R { return visitor.visitPrint(this) } } data class Return( val keyword: Token, val value: Expr? ) : Stmt() { override fun accept(visitor: StmtVisitor): R { return visitor.visitReturn(this) } } data class Var( val name: Token, val initializer: Expr? ) : Stmt() { override fun accept(visitor: StmtVisitor): R { return visitor.visitVar(this) } } data class While( val condition: Expr, val body: Stmt ) : Stmt() { override fun accept(visitor: StmtVisitor): R { return visitor.visitWhile(this) } }