package com.craftinginterpreters.lox; import java.util.List; abstract class Stmt { interface Visitor { R visitBlockStmt(Block stmt); R visitExpressionStmt(Expression stmt); R visitPrintStmt(Print stmt); R visitVarStmt(Var stmt); } static class Block extends Stmt { Block(List statements) { this.statements = statements; } @Override R accept(Visitor visitor) { return visitor.visitBlockStmt(this); } final List statements; } 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 Print extends Stmt { Print(Expr expression) { this.expression = expression; } @Override R accept(Visitor visitor) { return visitor.visitPrintStmt(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; } abstract R accept(Visitor visitor); }