package lox; abstract class Stmt { interface Visitor { R visitExpressionStmt(Expression stmt); R visitVarStmt(Var stmt); R visitPrintStmt(Print stmt); } static class Expression extends Stmt { Expression(Expr expression) { this.expression = expression; } @Override R accept(Visitor visitor) { return visitor.visitExpressionStmt(this); } final Expr expression; } static class Var extends Stmt { Var(Token name, Expr initializer) { this.name = name; this.initializer = initializer; } @Override R accept(Visitor visitor) { return visitor.visitVarStmt(this); } final Token name; final Expr initializer; } static class Print extends Stmt { Print(Expr expression) { this.expression = expression; } @Override R accept(Visitor visitor) { return visitor.visitPrintStmt(this); } final Expr expression; } abstract R accept(Visitor visitor); }