package edu.uva.softwarecons.evaluator; import edu.uva.softwarecons.model.expression.arithmetic.AddExpression; import edu.uva.softwarecons.model.expression.arithmetic.DivExpression; import edu.uva.softwarecons.model.expression.arithmetic.MulExpression; import edu.uva.softwarecons.model.expression.arithmetic.SubExpression; import edu.uva.softwarecons.model.expression.comparison.EqualExpression; import edu.uva.softwarecons.model.expression.comparison.GreaterEqualExpression; import edu.uva.softwarecons.model.expression.comparison.GreaterExpression; import edu.uva.softwarecons.model.expression.comparison.LessEqualExpression; import edu.uva.softwarecons.model.expression.comparison.LessExpression; import edu.uva.softwarecons.model.expression.comparison.NotEqualExpression; import edu.uva.softwarecons.model.expression.literal.BoolExpression; import edu.uva.softwarecons.model.expression.literal.IdExpression; import edu.uva.softwarecons.model.expression.literal.IntExpression; import edu.uva.softwarecons.model.expression.logical.AndExpression; import edu.uva.softwarecons.model.expression.logical.NotExpression; import edu.uva.softwarecons.model.expression.logical.OrExpression; import edu.uva.softwarecons.model.value.ArithmeticValue; import edu.uva.softwarecons.model.value.BooleanValue; import edu.uva.softwarecons.model.value.ComparableValue; import edu.uva.softwarecons.model.value.IntegerValue; import edu.uva.softwarecons.model.value.Value; import edu.uva.softwarecons.visitor.expression.ExpressionEvalVisitor; import java.util.HashMap; /** * Falconlabs * * @author Santiago Carrillo * Date: 3/13/14 */ public class ExpressionEvaluator implements ExpressionEvalVisitor { private HashMap<String, Value> context = new HashMap<String, Value>(); public ExpressionEvaluator() { } public void addContextValue( String key, Value value ) { context.put( key, value ); } @Override public Value visitAddExpression( AddExpression expression ) { return ( (ArithmeticValue) expression.getLeftExpression().accept( this ) ). add( expression.getRightExpression().accept( this ) ); } @Override public Value visitDivExpression( DivExpression expression ) { return ( (ArithmeticValue) expression.getLeftExpression().accept( this ) ). divide( expression.getRightExpression().accept( this ) ); } @Override public Value visitMulExpression( MulExpression expression ) { return ( (ArithmeticValue) expression.getLeftExpression().accept( this ) ). multiply( expression.getRightExpression().accept( this ) ); } @Override public Value visitSubExpression( SubExpression expression ) { return ( (ArithmeticValue) expression.getLeftExpression().accept( this ) ). subtract( expression.getRightExpression().accept( this ) ); } @Override public Value visitAndExpression( AndExpression expression ) { return ( (BooleanValue) expression.getLeftExpression().accept( this ) ). and( expression.getRightExpression().accept( this ) ); } @Override public Value visitOrExpression( OrExpression expression ) { return ( (BooleanValue) expression.getLeftExpression().accept( this ) ). or( expression.getRightExpression().accept( this ) ); } @Override public Value visitNotExpression( NotExpression expression ) { return ( (BooleanValue) expression.getArgument().accept( this ) ).not(); } @Override public Value visitEqualExpression( EqualExpression expression ) { return new BooleanValue( expression.getLeftExpression().accept( this ). equals( expression.getRightExpression().accept( this ) ) ); } @Override public Value visitNotEqualExpression( NotEqualExpression expression ) { return new BooleanValue( !expression.getLeftExpression().accept( this ). equals( expression.getRightExpression().accept( this ) ) ); } @Override public Value visitGreaterEqualExpression( GreaterEqualExpression expression ) { return new BooleanValue( ( (ComparableValue) expression.getLeftExpression().accept( this ) ). greaterEqual( expression.getRightExpression().accept( this ) ) ); } @Override public Value visitGreaterExpression( GreaterExpression expression ) { return new BooleanValue( ( (ComparableValue) expression.getLeftExpression().accept( this ) ). greater( expression.getRightExpression().accept( this ) ) ); } @Override public Value visitLessEqualExpression( LessEqualExpression expression ) { return new BooleanValue( ( (ComparableValue) expression.getLeftExpression().accept( this ) ). lessEqual( expression.getRightExpression().accept( this ) ) ); } @Override public Value visitLessExpression( LessExpression expression ) { return new BooleanValue( ( (ComparableValue) expression.getLeftExpression().accept( this ) ). less( expression.getRightExpression().accept( this ) ) ); } @Override public Value visitIdExpression( IdExpression expression ) { return context.get( expression.getId() ); } @Override public Value visitBoolExpression( BoolExpression expression ) { return new BooleanValue( expression.getValue() ); } @Override public Value visitIntExpression( IntExpression expression ) { return new IntegerValue( expression.getValue() ); } }