package visitor; import java.util.List; import nodeAST.Expression; import nodeAST.Ident; import nodeAST.arithmetic.Add; import nodeAST.arithmetic.Div; import nodeAST.arithmetic.Mul; import nodeAST.arithmetic.Sub; import nodeAST.conditional.And; import nodeAST.conditional.Or; import nodeAST.literals.Bool; import nodeAST.literals.Int; import nodeAST.literals.Str; import nodeAST.relational.Eq; import nodeAST.relational.GEq; import nodeAST.relational.GT; import nodeAST.relational.LEq; import nodeAST.relational.LT; import nodeAST.relational.NEq; import nodeAST.syntactic.Form; import nodeAST.syntactic.IfBlock; import nodeAST.syntactic.IfElseBlock; import nodeAST.syntactic.Question; import nodeAST.syntactic.QuestionBody; import nodeAST.syntactic.Statement; import types.BoolType; import types.IntType; import types.StringType; import types.Type; import nodeAST.sign.Neg; import nodeAST.sign.Not; import nodeAST.sign.Pos; public abstract class ASTVisitor { public void visit(Ident ident) {} private void visitOne(Expression operand) { operand.accept(this); } private void visitBoth( Expression leftHandOperand, Expression rightHandOperand) { leftHandOperand.accept(this); rightHandOperand.accept(this); } public void visit(Add add, Expression leftHandOperand, Expression rightHandOperand) { this.visitBoth(leftHandOperand, rightHandOperand); } public void visit(Div div, Expression leftHandOperand, Expression rightHandOperand) { this.visitBoth(leftHandOperand, rightHandOperand); } public void visit(Mul mul, Expression leftHandOperand, Expression rightHandOperand) { this.visitBoth(leftHandOperand, rightHandOperand); } public void visit(Sub sub, Expression leftHandOperand, Expression rightHandOperand) { this.visitBoth(leftHandOperand, rightHandOperand); } public void visit(And and, Expression leftHandOperand, Expression rightHandOperand) { this.visitBoth(leftHandOperand, rightHandOperand); } public void visit(Or or, Expression leftHandOperand, Expression rightHandOperand) { this.visitBoth(leftHandOperand, rightHandOperand); } public void visit(Eq eq, Expression leftHandOperand, Expression rightHandOperand) { this.visitBoth(leftHandOperand, rightHandOperand); } public void visit(GEq gEq, Expression leftHandOperand, Expression rightHandOperand) { this.visitBoth(leftHandOperand, rightHandOperand); } public void visit(GT gt, Expression leftHandOperand, Expression rightHandOperand) { this.visitBoth(leftHandOperand, rightHandOperand); } public void visit(LEq lEq, Expression leftHandOperand, Expression rightHandOperand) { this.visitBoth(leftHandOperand, rightHandOperand); } public void visit(LT lt, Expression leftHandOperand, Expression rightHandOperand) { this.visitBoth(leftHandOperand, rightHandOperand); } public void visit(NEq nEq, Expression leftHandOperand, Expression rightHandOperand) { this.visitBoth(leftHandOperand, rightHandOperand); } public void visit(Neg neg, Expression operand) { this.visitOne(operand); } public void visit(Not not, Expression operand) { this.visitOne(operand); } public void visit(Pos pos, Expression operand) { this.visitOne(operand); } public void visit(Bool bool) {} public void visit(Int int1) {} public void visit(BoolType bool) {} public void visit(IntType intType) {} public void visit(Form form, List<Statement> list) { for(Statement s : list) s.accept(this); } public void visit(IfBlock ifBlock, Expression condition, List<Statement> thenStatements) { condition.accept(this); for(Statement s : thenStatements) s.accept(this); } public void visit(IfElseBlock ifElseBlock, Expression condition, List<Statement> thenStatements, List<Statement> elseStatements) { condition.accept(this); for(Statement s : thenStatements) s.accept(this); for(Statement s : elseStatements) s.accept(this); } public void visit(Question question, Ident ident, QuestionBody questionBody, Type type, Expression expr) { ident.accept(this); questionBody.accept(this); type.accept(this); if(expr!=null) expr.accept(this); } public void visit(QuestionBody questionBody) {} public void visit(StringType stringType) { } public void visit(Str str) {} }