public object visit_Binary_Expr(GExpr.Binary expr) { Object left = evaluate(expr.left); Object right = evaluate(expr.right); switch (expr.Operator.type) { case tt.MINUS: checkNumberOperands(expr.Operator, left, right); return((double)left - (double)right); case tt.SLASH: checkNumberOperands(expr.Operator, left, right); return((double)left / (double)right); case tt.STAR: checkNumberOperands(expr.Operator, left, right); return((double)left * (double)right); case tt.PLUS: if ((left is double) && (right is double)) { return((double)left + (double)right); } if ((left is string) && (right is string)) { return(left.ToString() + right.ToString()); } throw new RuntimeError(expr.Operator, "Operands must be two numbers or two strings"); case tt.GREATER: checkNumberOperands(expr.Operator, left, right); return((double)left > (double)right); case tt.GREATER_EQUAL: checkNumberOperands(expr.Operator, left, right); return((double)left >= (double)right); case tt.LESS: checkNumberOperands(expr.Operator, left, right); return((double)left < (double)right); case tt.LESS_EQUAL: checkNumberOperands(expr.Operator, left, right); return((double)left <= (double)right); case tt.EQUAL_EQUAL: return(isEqual(left, right)); case tt.BANG_EQUAL: return(!isEqual(left, right)); } return(null); }
private GExpr.Expr equality() { GExpr.Expr expr = comparison(); while (Match(tt.BANG_EQUAL, tt.EQUAL_EQUAL)) { Token Operator = previous(); GExpr.Expr right = comparison(); expr = new GExpr.Binary(expr, Operator, right); } return(expr); }
private GExpr.Expr multiplication() { GExpr.Expr expr = unary(); while (Match(tt.SLASH, tt.STAR)) { Token Operator = previous(); GExpr.Expr right = unary(); expr = new GExpr.Binary(expr, Operator, right); } return(expr); }
private GExpr.Expr addition() { GExpr.Expr expr = multiplication(); while (Match(tt.MINUS, tt.PLUS)) { Token Operator = previous(); GExpr.Expr right = multiplication(); expr = new GExpr.Binary(expr, Operator, right); } return(expr); }
private GExpr.Expr comparison() { GExpr.Expr expr = addition(); while (Match(tt.GREATER, tt.GREATER_EQUAL, tt.LESS, tt.LESS_EQUAL)) { Token Operator = previous(); GExpr.Expr right = addition(); expr = new GExpr.Binary(expr, Operator, right); } return(expr); }