package nl.uva.sc.encoders.qlruntime.evaluator; import java.util.List; import nl.uva.sc.encoders.ql.ast.expression.BinaryExpression; import nl.uva.sc.encoders.ql.ast.expression.BracedExpression; import nl.uva.sc.encoders.ql.ast.expression.Expression; import nl.uva.sc.encoders.ql.ast.expression.LiteralExpression; import nl.uva.sc.encoders.ql.ast.expression.NameExpression; import nl.uva.sc.encoders.ql.ast.expression.UnaryExpression; import nl.uva.sc.encoders.ql.ast.literal.BooleanLiteral; import nl.uva.sc.encoders.ql.ast.literal.IntegerLiteral; import nl.uva.sc.encoders.ql.ast.literal.StringLiteral; import nl.uva.sc.encoders.ql.ast.operator.BinaryOperator; import nl.uva.sc.encoders.ql.ast.operator.UnaryOperator; import nl.uva.sc.encoders.ql.visitor.ExpressionVisitor; import nl.uva.sc.encoders.ql.visitor.LiteralVisitor; import nl.uva.sc.encoders.qlruntime.model.RuntimeQuestion; import nl.uva.sc.encoders.qlruntime.model.value.BooleanValue; import nl.uva.sc.encoders.qlruntime.model.value.IntegerValue; import nl.uva.sc.encoders.qlruntime.model.value.StringValue; import nl.uva.sc.encoders.qlruntime.model.value.Value; public class ExpressionEvaluator implements ExpressionVisitor<Value>, LiteralVisitor<Value> { private final List<RuntimeQuestion> questions; public ExpressionEvaluator(List<RuntimeQuestion> questions) { this.questions = questions; } @Override public Value visit(BracedExpression bracedExpression) { Expression expression = bracedExpression.getExpression(); return expression.accept(this); } @Override public Value visit(BinaryExpression binaryExpression) { Expression leftHand = binaryExpression.getLeftHand(); Expression rightHand = binaryExpression.getRightHand(); Value leftValue = leftHand.accept(this); Value rightValue = rightHand.accept(this); BinaryOperator operator = binaryExpression.getOperator(); return operator.accept(new BinaryEvaluator(leftValue, rightValue)); } @Override public Value visit(UnaryExpression unaryExpression) { Expression expression = unaryExpression.getExpression(); UnaryOperator operator = unaryExpression.getOperator(); Value value = expression.accept(this); return operator.accept(new UnaryEvaluator(value)); } @Override public Value visit(NameExpression nameExpression) { String name = nameExpression.getName(); RuntimeQuestion runtimeQuestion = RuntimeQuestion.getRuntimeQuestion(name, questions); return runtimeQuestion.getValue(); } @Override public Value visit(BooleanLiteral booleanLiteral) { return new BooleanValue(booleanLiteral.getValue()); } @Override public Value visit(IntegerLiteral integerLiteral) { return new IntegerValue(integerLiteral.getValue()); } @Override public Value visit(StringLiteral stringLiteral) { return new StringValue(stringLiteral.getValue()); } @Override public Value visit(LiteralExpression literalExpression) { return literalExpression.getLiteral().accept(this); } }