visitBinaryExpr method

  1. @override
Object? visitBinaryExpr(
  1. 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;
  }
}