// General Notes: // - List refers to your own implementation of lists // with subclasses NIL and CONS (see also SL-parse.tgz) // You are free to use LinkedList instead. // http://java.sun.com/j2se/1.5.0/docs/api/java/util/LinkedList.html // - Auxiliary data-types for Maybe, Tuple etc // are provided; depending on your grammar you // may or may not need them // - For implementing the visitor pattern, you can directly // use the accept methods as defined in the classes // - There should be no need to modify this file at all. If you do, // you're probably implementing a visitor pattern or such the // wrong way. abstract class Program { public abstract A accept (ProgramVisitor v); } class Prg extends Program { public Decl main; public List ds; public Prg (Decl main, List ds) { this.main = main; this.ds = ds; } public A accept (ProgramVisitor v) { return v.visit (this); } } interface ProgramVisitor { public A visit (Prg p); } abstract class Maybe { public abstract A accept (MaybeVisitor v); } class Nothing extends Maybe { public Nothing () { } public A accept (MaybeVisitor v) { return v.visit (this); } } class Just extends Maybe { public a just; public Just (a just) { this.just = just; } public A accept (MaybeVisitor v) { return v.visit (this); } } interface MaybeVisitor { public A visit (Nothing m); public A visit (Just m); } abstract class Tuple2 { public abstract A accept (Tuple2Visitor v); } class T2 extends Tuple2 { public a fst2; public b snd2; public T2 (a fst2, b snd2) { this.fst2 = fst2; this.snd2 = snd2; } public A accept (Tuple2Visitor v) { return v.visit (this); } } interface Tuple2Visitor { public A visit (T2 t); } abstract class Either2 { public abstract A accept (Either2Visitor v); } class Left2 extends Either2 { public Tuple2,Expression> left2; public Left2 (Tuple2,Expression> left2) { this.left2 = left2; } public A accept (Either2Visitor v) { return v.visit (this); } } class Right2 extends Either2 { public String right2; public Right2 (String right2) { this.right2 = right2; } public A accept (Either2Visitor v) { return v.visit (this); } } interface Either2Visitor { public A visit (Left2 e); public A visit (Right2 e); } abstract class Meth3 { public abstract A accept (Meth3Visitor v); } class M3 extends Meth3 { public List fst3; public List snd3; public Expression thd3; public M3 (List fst3, List snd3, Expression thd3) { this.fst3 = fst3; this.snd3 = snd3; this.thd3 = thd3; } public A accept (Meth3Visitor v) { return v.visit (this); } } interface Meth3Visitor { public A visit (M3 m); } abstract class Decl { public abstract A accept (DeclVisitor v); } class MethDecl extends Decl { public Type ty; public String id; public List ps; public List ds; public List ss; public Expression e; public MethDecl (Type ty, String id, List ps, List ds, List ss, Expression e) { this.ty = ty; this.id = id; this.ps = ps; this.ds = ds; this.ss = ss; this.e = e; } public A accept (DeclVisitor v) { return v.visit (this); } } class VarDecl extends Decl { public Type ty; public String id; public VarDecl (Type ty, String id) { this.ty = ty; this.id = id; } public A accept (DeclVisitor v) { return v.visit (this); } } class ClassDecl extends Decl { public String id; public Maybe id0; public List vs; public List ms; public ClassDecl (String id, Maybe id0, List vs, List ms) { this.id = id; this.id0 = id0; this.vs = vs; this.ms = ms; } public A accept (DeclVisitor v) { return v.visit (this); } } class MainDecl extends Decl { public String id; public String id0; public Statement s; public MainDecl (String id, String id0, Statement s) { this.id = id; this.id0 = id0; this.s = s; } public A accept (DeclVisitor v) { return v.visit (this); } } interface DeclVisitor { public A visit (MethDecl d); public A visit (VarDecl d); public A visit (ClassDecl d); public A visit (MainDecl d); } abstract class Type { public abstract A accept (TypeVisitor v); } class BoolTy extends Type { public BoolTy () { } public A accept (TypeVisitor v) { return v.visit (this); } } class IntTy extends Type { public IntTy () { } public A accept (TypeVisitor v) { return v.visit (this); } } class ObjTy extends Type { public String c; public ObjTy (String c) { this.c = c; } public A accept (TypeVisitor v) { return v.visit (this); } } class ArrTy extends Type { public Type ty; public ArrTy (Type ty) { this.ty = ty; } public A accept (TypeVisitor v) { return v.visit (this); } } interface TypeVisitor { public A visit (BoolTy t); public A visit (IntTy t); public A visit (ObjTy t); public A visit (ArrTy t); } abstract class Params { public abstract A accept (ParamsVisitor v); } class Par extends Params { public String id; public Type ty; public Par (String id, Type ty) { this.id = id; this.ty = ty; } public A accept (ParamsVisitor v) { return v.visit (this); } } interface ParamsVisitor { public A visit (Par p); } abstract class Statement { public abstract A accept (StatementVisitor v); } class SList extends Statement { public List ss; public SList (List ss) { this.ss = ss; } public A accept (StatementVisitor v) { return v.visit (this); } } class IfStm extends Statement { public Expression e; public Statement sT; public Statement sE; public IfStm (Expression e, Statement sT, Statement sE) { this.e = e; this.sT = sT; this.sE = sE; } public A accept (StatementVisitor v) { return v.visit (this); } } class WhileStm extends Statement { public Expression e; public Statement s; public WhileStm (Expression e, Statement s) { this.e = e; this.s = s; } public A accept (StatementVisitor v) { return v.visit (this); } } class PrintStm extends Statement { public Expression e; public PrintStm (Expression e) { this.e = e; } public A accept (StatementVisitor v) { return v.visit (this); } } class AssignStm extends Statement { public String id; public Expression e; public AssignStm (String id, Expression e) { this.id = id; this.e = e; } public A accept (StatementVisitor v) { return v.visit (this); } } class ArrAssignStm extends Statement { public String id; public Expression e1; public Expression e2; public ArrAssignStm (String id, Expression e1, Expression e2) { this.id = id; this.e1 = e1; this.e2 = e2; } public A accept (StatementVisitor v) { return v.visit (this); } } interface StatementVisitor { public A visit (SList s); public A visit (IfStm s); public A visit (WhileStm s); public A visit (PrintStm s); public A visit (AssignStm s); public A visit (ArrAssignStm s); } abstract class Expression { public abstract A accept (ExpressionVisitor v); } class CTrue extends Expression { public CTrue () { } public A accept (ExpressionVisitor v) { return v.visit (this); } } class CFalse extends Expression { public CFalse () { } public A accept (ExpressionVisitor v) { return v.visit (this); } } class This extends Expression { public This () { } public A accept (ExpressionVisitor v) { return v.visit (this); } } class NewInt extends Expression { public Expression e; public NewInt (Expression e) { this.e = e; } public A accept (ExpressionVisitor v) { return v.visit (this); } } class New extends Expression { public String id; public New (String id) { this.id = id; } public A accept (ExpressionVisitor v) { return v.visit (this); } } class Bonzo extends Expression { public Expression e; public Bonzo (Expression e) { this.e = e; } public A accept (ExpressionVisitor v) { return v.visit (this); } } class Infx extends Expression { public final static int PLUS=1, MINUS=2, TIMES=3, DIV=4, AND=5, LT=6; public Expression e1; public int op; public Expression e2; public Infx (Expression e1, int op, Expression e2) { this.e1 = e1; this.op = op; this.e2 = e2; } public A accept (ExpressionVisitor v) { return v.visit (this); } } class Get extends Expression { public Expression e1; public Expression e2; public Get (Expression e1, Expression e2) { this.e1 = e1; this.e2 = e2; } public A accept (ExpressionVisitor v) { return v.visit (this); } } class Len extends Expression { public Expression e; public Len (Expression e) { this.e = e; } public A accept (ExpressionVisitor v) { return v.visit (this); } } class Invoke extends Expression { public Expression e; public String id; public List es; public Invoke (Expression e, String id, List es) { this.e = e; this.id = id; this.es = es; } public A accept (ExpressionVisitor v) { return v.visit (this); } } class IConst extends Expression { public int n; public IConst (int n) { this.n = n; } public A accept (ExpressionVisitor v) { return v.visit (this); } } class Id extends Expression { public String id; public Id (String id) { this.id = id; } public A accept (ExpressionVisitor v) { return v.visit (this); } } interface ExpressionVisitor { public A visit (CTrue e); public A visit (CFalse e); public A visit (This e); public A visit (NewInt e); public A visit (New e); public A visit (Bonzo e); public A visit (Infx e); public A visit (Get e); public A visit (Len e); public A visit (Invoke e); public A visit (IConst e); public A visit (Id e); }