Example #1
0
        public object VisitBinary(Expression.Binary expression)
        {
            var left  = Evaluate(expression.Left);
            var right = Evaluate(expression.Right);

            switch (expression.Operator.Type)
            {
            case TokenType.Minus:
                CheckNumberOperands(expression.Operator, left, right);
                return((double)left - (double)right);

            case TokenType.Slash:
                CheckNumberOperands(expression.Operator, left, right);
                return((double)left / (double)right);

            case TokenType.Star:
                CheckNumberOperands(expression.Operator, left, right);
                return((double)left * (double)right);

            case TokenType.Plus:
                if (left is double && right is double)
                {
                    return((double)left + (double)right);
                }
                if (left is string && right is string)
                {
                    return((string)left + (string)right);
                }
                throw new RuntimeError(expression.Operator, "Operands must be two numbers or two strings.");

            case TokenType.Greater:
                CheckNumberOperands(expression.Operator, left, right);
                return((double)left > (double)right);

            case TokenType.GreaterEqual:
                CheckNumberOperands(expression.Operator, left, right);
                return((double)left >= (double)right);

            case TokenType.Less:
                CheckNumberOperands(expression.Operator, left, right);
                return((double)left < (double)right);

            case TokenType.LessEqual:
                CheckNumberOperands(expression.Operator, left, right);
                return((double)left <= (double)right);

            case TokenType.BangEqual:
                return(!IsEqual(left, right));

            case TokenType.EqualEqual:
                return(IsEqual(left, right));

            default:
                throw new NotImplementedException();
            }
        }
Example #2
0
        private Expression Multiplication()
        {
            var expression = Unary();

            while (Match(TokenType.Star, TokenType.Slash))
            {
                var @operator = Previous();
                var right     = Unary();
                expression = new Expression.Binary(expression, @operator, right);
            }

            return(expression);
        }
Example #3
0
        private Expression Addition()
        {
            var expression = Multiplication();

            while (Match(TokenType.Minus, TokenType.Plus))
            {
                var @operator = Previous();
                var right     = Multiplication();
                expression = new Expression.Binary(expression, @operator, right);
            }

            return(expression);
        }
Example #4
0
        private Expression Comparison()
        {
            var expression = Addition();

            while (Match(TokenType.Greater, TokenType.GreaterEqual, TokenType.Less, TokenType.LessEqual))
            {
                var @operator = Previous();
                var right     = Addition();
                expression = new Expression.Binary(expression, @operator, right);
            }

            return(expression);
        }
Example #5
0
        private Expression Equality()
        {
            var expression = Comparison();

            while (Match(TokenType.BangEqual, TokenType.EqualEqual))
            {
                var @operator = Previous();
                var right     = Comparison();
                expression = new Expression.Binary(expression, @operator, right);
            }

            return(expression);
        }
Example #6
0
 public string VisitBinary(Expression.Binary expression)
 {
     return(Parenthesize(expression.Operator.Lexeme, expression.Left, expression.Right));
 }