visitBinaryExpr method
Object?
visitBinaryExpr(
- Binary expr
)
Implementation
@override
Object? visitBinaryExpr(Binary expr) {
final left = _evaluate(expr.left);
final right = _evaluate(expr.right);
switch (expr.operator.type) {
case TokenType.greater:
_checkNumberOperands(expr.operator, left, right);
return (left as double) > (right as double);
case TokenType.greaterEqual:
_checkNumberOperands(expr.operator, left, right);
return (left as double) >= (right as double);
case TokenType.less:
_checkNumberOperands(expr.operator, left, right);
return (left as double) < (right as double);
case TokenType.lessEqual:
_checkNumberOperands(expr.operator, left, right);
return (left as double) <= (right as double);
case TokenType.bangEqual:
return left != right; // TODO(mateusfccp): Check if this is valid, as the implementation differs from the Java version from the book
case TokenType.equalEqual:
return left == right; // TODO(mateusfccp): Check if this is valid, as the implementation differs from the Java version from the book
case TokenType.minus:
_checkNumberOperands(expr.operator, left, right);
return (left as double) - (right as double);
case TokenType.plus:
if ((left is double && right is double) || (left is String && right is String)) {
return (left as dynamic) + (right as dynamic);
} else {
throw RuntimeError(expr.operator, 'Operands must be two numbers or two strings. Got');
}
case TokenType.slash:
_checkNumberOperands(expr.operator, left, right);
return (left as double) / (right as double);
case TokenType.star:
_checkNumberOperands(expr.operator, left, right);
return (left as double) * (right as double);
default:
return null;
}
}