package ql.ast.visitor; import ql.ast.Statement; import ql.ast.statement.Block; import ql.ast.statement.ComputedQuestion; import ql.ast.statement.Form; import ql.ast.statement.If; import ql.ast.statement.IfElse; import ql.ast.statement.Question; public abstract class StatementVisitor<T> { private ExpressionVisitor<?> expressionVisitor; private TypeVisitor<?> typeVisitor; public void setExpressionVisitor(ExpressionVisitor<?> expressionVisitor) { this.expressionVisitor = expressionVisitor; } public void setTypeVisitor(TypeVisitor<?> typeVisitor) { this.typeVisitor = typeVisitor; } public T visit(Block blockNode) { for(Statement statement : blockNode.getStatements()) { statement.accept(this); } return null; } public T visit(ComputedQuestion compQuestionNode) { compQuestionNode.getIdentifier().accept(expressionVisitor); compQuestionNode.getType().accept(typeVisitor); compQuestionNode.getText().accept(expressionVisitor); compQuestionNode.getExpression().accept(expressionVisitor); return null; } public T visit(Form formNode) { formNode.getIdentifier().accept(expressionVisitor); formNode.getBlock().accept(this); return null; } public T visit(If ifNode) { ifNode.getExpression().accept(expressionVisitor); ifNode.getBlock().accept(this); return null; } public T visit(IfElse ifElseNode) { ifElseNode.getExpression().accept(expressionVisitor); ifElseNode.getIfBranch().accept(this); ifElseNode.getElseBranch().accept(this); return null; } public T visit(Question questionNode) { questionNode.getIdentifier().accept(expressionVisitor); questionNode.getType().accept(typeVisitor); questionNode.getText().accept(expressionVisitor); return null; } }