package main.nl.uva.parser.expression;
import main.nl.uva.parser.Line;
import main.nl.uva.validation.ASTValidation;
import main.nl.uva.validation.Scope;
import main.nl.uva.validation.error.InvalidTypeError;
import main.nl.uva.validation.type.Bool;
import main.nl.uva.validation.type.Invalid;
import main.nl.uva.validation.type.Money;
import main.nl.uva.validation.type.Text;
import main.nl.uva.validation.type.Value;
public abstract class BinaryExpression extends Expression {
protected Value _value = null;
protected Expression _left;
protected Expression _right;
public BinaryExpression(final Expression left, final Expression right, final Line lineInfo) {
super(lineInfo);
_left = left;
_right = right;
}
@Override
public final ASTValidation validateAndCalculate(final Scope scope) {
ASTValidation valid = _left.validateAndCalculate(scope);
valid.combine(_right.validateAndCalculate(scope));
_value = _left.getValue().calculateValueWith(_right, this);
notifyListenersAboutValueChange();
if (_value.isInvalid()) {
valid.addError(new InvalidTypeError(this.toString(), getLineInfo()));
}
return valid;
}
@Override
public Value getValue() {
return _value;
}
public Value calculateValue(final Bool left, final Bool right) {
return new Invalid();
}
public Value calculateValue(final Money left, final Money right) {
return new Invalid();
}
public Value calculateValue(final Text left, final Text right) {
return new Invalid();
}
public Value calculateValue(final Bool left, final Money right) {
return new Invalid();
}
public Value calculateValue(final Bool left, final Text right) {
return new Invalid();
}
public Value calculateValue(final Money left, final Bool right) {
return new Invalid();
}
public Value calculateValue(final Money left, final Text right) {
return new Invalid();
}
public Value calculateValue(final Text left, final Bool right) {
return new Invalid();
}
public Value calculateValue(final Text left, final Money right) {
return new Invalid();
}
}