Esempio n. 1
0
        private Expr And()
        {
            var expr = Equality();

            while (Match(TokenType.And))
            {
                var op    = Previous();
                var right = Equality();
                expr = new Logical(expr, op, right);
            }

            return(expr);
        }
Esempio n. 2
0
        private Expr Or()
        {
            var expr = And();

            while (Match(TokenType.Or))
            {
                var op    = Previous();
                var right = And();
                expr = new Logical(expr, op, right);
            }

            return(expr);
        }
Esempio n. 3
0
        public object VisitLogical(Logical logical)
        {
            object left = logical.Left.Accept(this);

            if (logical.Op.Type == OR && IsTrue(left))
            {
                return(left);//early out -> TRUE
            }
            if (logical.Op.Type == AND && !IsTrue(left))
            {
                return(left);//early out -> FALSE
            }
            object right = logical.Right.Accept(this);

            return(right);
        }
Esempio n. 4
0
        public object Visit(Logical expr)
        {
            var left = Evaluate(expr.Left);

            if (expr.Op.Type == Or)
            {
                if (IsTruthy(left))
                {
                    return(left);
                }
            }
            else
            {
                if (!IsTruthy(left))
                {
                    return(left);
                }
            }

            return(Evaluate(expr.Right));
        }