Пример #1
0
        private Expr Factor()
        {
            var expr = Unary();

            while (Match(SLASH, STAR))
            {
                var op    = Previous();
                var right = Unary();
                expr = new Expr.Binary(expr, op, right);
            }

            return(expr);
        }
Пример #2
0
        private Expr Term()
        {
            var expr = Factor();

            while (Match(MINUS, PLUS))
            {
                var op    = Previous();
                var right = Factor();
                expr = new Expr.Binary(expr, op, right);
            }

            return(expr);
        }
Пример #3
0
        private Expr equality()
        {
            Expr expr = comparison();

            while (match(TokenType.BANG_EQUAL, TokenType.EQUAL_EQUAL))
            {
                Token op    = previous();
                Expr  right = comparison();
                expr = new Expr.Binary(expr, op, right);
            }

            return(expr);
        }
Пример #4
0
        private Expr Equality()
        {
            var expr = Comparison();

            while (Match(BANG_EQUAL, EQUAL_EQUAL))
            {
                var op    = Previous();
                var right = Comparison();
                expr = new Expr.Binary(expr, op, right);
            }

            return(expr);
        }
Пример #5
0
        private Expr multiplication()
        {
            Expr expr = unary();

            while (match(TokenType.SLASH, TokenType.STAR))
            {
                Token op    = previous();
                Expr  right = unary();
                expr = new Expr.Binary(expr, op, right);
            }

            return(expr);
        }
Пример #6
0
        private Expr comparison()
        {
            Expr expr = addition();

            while (match(TokenType.GREATER, TokenType.GREATER_EQUAL, TokenType.LESS, TokenType.LESS_EQUAL))
            {
                Token op    = previous();
                Expr  right = addition();
                expr = new Expr.Binary(expr, op, right);
            }

            return(expr);
        }
Пример #7
0
        private Expr addition()
        {
            Expr expr = multiplication();

            while (match(TokenType.MINUS, TokenType.PLUS))
            {
                Token op    = previous();
                Expr  right = multiplication();
                expr = new Expr.Binary(expr, op, right);
            }

            return(expr);
        }
Пример #8
0
        private Expr Comparison()
        {
            var expr = Term();

            while (Match(GREATER, GREATER_EQUAL, LESS, LESS_EQUAL))
            {
                var op    = Previous();
                var right = Term();
                expr = new Expr.Binary(expr, op, right);
            }

            return(expr);
        }
Пример #9
0
        private Expr Multiplication()
        {
            Expr expr = Unary();

            while (Match(TokenType.SLASH, TokenType.STAR))
            {
                Token opp   = Previous();
                Expr  right = Unary();
                expr = new Expr.Binary(expr, opp, right);
            }

            return(expr);
        }
Пример #10
0
 public string VisitBinaryExpr(Expr.Binary expr)
 => Parenthesize(expr.Operator.Lexeme, expr.Left, expr.Right);
Пример #11
0
        public object visitBinaryExpr(Expr.Binary expr)
        {
            object left  = evaluate(expr.left);
            object right = evaluate(expr.right);

            switch (expr.op.type)
            {
            case TokenType.MINUS:
                checkNumberOperands(expr.op, left, right);
                return((double)left - (double)right);

            case TokenType.SLASH:
                checkNumberOperands(expr.op, left, right);
                if ((double)right != 0.0)
                {
                    return((double)left / (double)right);
                }
                throw new RuntimeError(expr.op,
                                       "Division by zero");

            case TokenType.STAR:
                checkNumberOperands(expr.op, 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);
                }
                if (left is string && !(right is string))
                {
                    return((string)left + right);
                }
                if (!(left is string) && right is string)
                {
                    return(left + (string)right);
                }

                throw new RuntimeError(expr.op,
                                       "Operands must be two numbers or two strings.");

            case TokenType.GREATER:
                checkNumberOperands(expr.op, left, right);
                return((double)left > (double)right);

            case TokenType.GREATER_EQUAL:
                checkNumberOperands(expr.op, left, right);
                return((double)left >= (double)right);

            case TokenType.LESS:
                checkNumberOperands(expr.op, left, right);
                return((double)left < (double)right);

            case TokenType.LESS_EQUAL:
                checkNumberOperands(expr.op, left, right);
                return((double)left <= (double)right);

            case TokenType.BANG_EQUAL: return(!isEqual(left, right));

            case TokenType.EQUAL_EQUAL: return(isEqual(left, right));
            }

            // Unreachable.
            return(null);
        }
Пример #12
0
        object Expr.IVisitor <object> .Visit(Expr.Binary _binary)
        {
            object left  = Evaluate(_binary.left);
            object right = Evaluate(_binary.right);

            switch (_binary.opp.type)
            {
            case TokenType.BANG_EQUAL:
                CheckNumberOperand(_binary.opp, right);
                return(!IsEqual(left, right));

            case TokenType.EQUAL_EQUAL:
                CheckNumberOperand(_binary.opp, right);
                return(IsEqual(left, right));

            case TokenType.GREATER:
                CheckNumberOperand(_binary.opp, right);
                return((double)left > (double)right);

            case TokenType.GREATER_EQUAL:
                CheckNumberOperand(_binary.opp, right);
                return((double)left >= (double)right);

            case TokenType.LESS:
                CheckNumberOperand(_binary.opp, right);
                return((double)left < (double)right);

            case TokenType.LESS_EQUAL:
                CheckNumberOperand(_binary.opp, right);
                return((double)left <= (double)right);

            case TokenType.MINUS:
                CheckNumberOperands(_binary.opp, 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);
                }
                if (left is string && right is double)
                {
                    return((string)left + ((double)right).ToString());
                }
                throw new RuntimeError(_binary.opp, "Operands must be two numbers or two strings.");

            case TokenType.SLASH:
                CheckNumberOperand(_binary.opp, right);
                if ((double)right == 0)
                {
                    throw new RuntimeError(_binary.opp, "Cannot divide by zero.");
                }
                return((double)left / (double)right);

            case TokenType.STAR:
                CheckNumberOperand(_binary.opp, right);
                return((double)left * (double)right);
            }

            //unreachable
            return(null);
        }
Пример #13
0
 string Expr.IVisitor <string> .Visit(Expr.Binary _binary)
 {
     return(Parenthesize(_binary.opp.lexeme, _binary.left, _binary.right));
 }
Пример #14
0
 public string VisitBinaryExpr(Expr.Binary expr)
 {
     return(Parenthesize([email protected], expr.left, expr.right));
 }
Пример #15
0
 public string visitBinaryExpr(Expr.Binary expr)
 {
     return(parenthesize(expr.op.lexeme, expr.left, expr.right));
 }
Пример #16
0
 public object VisitBinaryExpr(Expr.Binary expr)
 {
     Resolve(expr.left);
     Resolve(expr.right);
     return(null);
 }
Пример #17
0
 public Void VisitBinaryExpr(Expr.Binary expr)
 {
     Resolve(expr.Left);
     Resolve(expr.Right);
     return(null);
 }