package org.uva.student.calinwouter.qlqls.ql.tests;
import org.uva.student.calinwouter.qlqls.generated.analysis.AnalysisAdapter;
import org.uva.student.calinwouter.qlqls.generated.node.*;
import org.uva.student.calinwouter.qlqls.ql.model.VariableTable;
import org.uva.student.calinwouter.qlqls.ql.exceptions.VariableNotSetException;
import org.uva.student.calinwouter.qlqls.ql.types.BooleanValue;
import org.uva.student.calinwouter.qlqls.ql.types.IntegerValue;
import org.uva.student.calinwouter.qlqls.ql.types.Value;
import static org.uva.student.calinwouter.qlqls.ql.helper.ASTHelper.*;
import java.util.Stack;
public class PExpressionInterpreter extends AnalysisAdapter {
private final VariableTable newVariableTable;
private final Stack<Value> valueStack;
@Override
public void caseAAddExpression(AAddExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.add(rightValue);
pushValue(result);
}
@Override
public void caseASubtractExpression(ASubtractExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.subtract(rightValue);
pushValue(result);
}
@Override
public void caseATrueExpression(ATrueExpression node) {
final BooleanValue trueValue = new BooleanValue(true);
pushValue(trueValue);
}
@Override
public void caseAFalseExpression(AFalseExpression node) {
final BooleanValue falseValue = new BooleanValue(false);
pushValue(falseValue);
}
@Override
public void caseAOrExpression(AOrExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.or(rightValue);
pushValue(result);
}
@Override
public void caseAAndExpression(AAndExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.and(rightValue);
pushValue(result);
}
@Override
public void caseAEqualsExpression(AEqualsExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.valueEquals(rightValue);
pushValue(result);
}
@Override
public void caseANotEqualsExpression(ANotEqualsExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.valueNotEquals(rightValue);
pushValue(result);
}
@Override
public void caseALesserThanExpression(ALesserThanExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.lesserThan(rightValue);
pushValue(result);
}
@Override
public void caseAGreaterThanExpression(AGreaterThanExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.greaterThan(rightValue);
pushValue(result);
}
@Override
public void caseALesserThanOrEqualsExpression(ALesserThanOrEqualsExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.lesserThanOrEquals(rightValue);
pushValue(result);
}
@Override
public void caseAGreaterThanOrEqualsExpression(AGreaterThanOrEqualsExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.greaterThanOrEquals(rightValue);
pushValue(result);
}
@Override
public void caseAMultiplyExpression(AMultiplyExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.multiply(rightValue);
pushValue(result);
}
@Override
public void caseADivideExpression(ADivideExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.divide(rightValue);
pushValue(result);
}
@Override
public void caseAModuloExpression(AModuloExpression node) {
final PExpression leftNode = node.getLeft();
final PExpression rightNode = node.getRight();
final Value leftValue = interpretExpression(leftNode);
final Value rightValue = interpretExpression(rightNode);
final Value result = leftValue.modulo(rightValue);
pushValue(result);
}
@Override
public void caseANotExpression(ANotExpression node) {
final PExpression nodeExpression = node.getExpression();
final Value nodeValue = interpretExpression(nodeExpression);
final Value notNodeValue = nodeValue.not();
pushValue(notNodeValue);
}
@Override
public void caseANumberExpression(ANumberExpression node) {
final Integer nodeExpAsInteger = getNumber(node);
final IntegerValue integerValue = new IntegerValue(nodeExpAsInteger);
pushValue(integerValue);
}
@Override
public void caseAIdentifierExpression(AIdentifierExpression node) {
final String nodeIdentifier = getIdentifier(node);
if (isNewVariableSet(nodeIdentifier)) {
final Value value = getVariableValueFromNewTable(nodeIdentifier);
pushValue(value);
return;
}
throw new VariableNotSetException(nodeIdentifier);
}
private Value getVariableValueFromNewTable(String nodeIdentifier) {
return newVariableTable.getVariable(nodeIdentifier);
}
private boolean isNewVariableSet(String nodeIdentifier) {
return newVariableTable.isSet(nodeIdentifier);
}
public Value popValue() {
return valueStack.pop();
}
private void pushValue(Value value) {
valueStack.push(value);
}
private Value interpretExpression(Node n) {
n.apply(this);
return popValue();
}
public PExpressionInterpreter(VariableTable newVariableTable) {
super();
this.newVariableTable = newVariableTable;
this.valueStack = new Stack<Value>();
}
}