// 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);
}