Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }