Exemple #1
0
        private BoundBinaryExpression BindBinaryOperatorExpression(BinaryOperatorExpressionSyntax syntax)
        {
            BaseBoundExpression left  = this.BindExpression(syntax.Left);
            BaseBoundExpression right = this.BindExpression(syntax.Right, expectsValue: !(left is BoundLibraryEventExpression));

            switch (syntax.OperatorToken.Kind)
            {
            case TokenKind.Or:
            case TokenKind.And:
            case TokenKind.NotEqual:
            case TokenKind.Equal:
            case TokenKind.LessThan:
            case TokenKind.GreaterThan:
            case TokenKind.LessThanOrEqual:
            case TokenKind.GreaterThanOrEqual:
            case TokenKind.Plus:
            case TokenKind.Minus:
            case TokenKind.Multiply:
            case TokenKind.Divide:
                return(new BoundBinaryExpression(syntax, hasValue: true, left.HasErrors || right.HasErrors, syntax.OperatorToken.Kind, left, right));

            default:
                throw ExceptionUtilities.UnexpectedValue(syntax.OperatorToken.Kind);
            }
        }
        public BoundBinaryExpression(BinaryOperatorExpressionSyntax syntax, bool hasValue, bool hasErrors, TokenKind kind, BaseBoundExpression left, BaseBoundExpression right)
            : base(hasValue, hasErrors)
        {
            Debug.Assert(!syntax.IsDefault(), "'syntax' must not be null.");
            Debug.Assert(!kind.IsDefault(), "'kind' must not be null.");
            Debug.Assert(!left.IsDefault(), "'left' must not be null.");
            Debug.Assert(!right.IsDefault(), "'right' must not be null.");

            this.Syntax = syntax;
            this.Kind   = kind;
            this.Left   = left;
            this.Right  = right;
        }
        private BaseExpressionSyntax ParseBinaryOperator(int precedence)
        {
            if (precedence >= BinaryOperatorPrecedence.Length)
            {
                return(this.ParseUnaryOperator());
            }

            var expression           = this.ParseBinaryOperator(precedence + 1);
            var expectedOperatorKind = BinaryOperatorPrecedence[precedence];

            while (this.index < this.tokens.Count && this.Peek() == expectedOperatorKind)
            {
                var operatorToken = this.Eat(expectedOperatorKind);
                var rightHandSide = this.ParseBinaryOperator(precedence + 1);

                expression = new BinaryOperatorExpressionSyntax(expression, operatorToken, rightHandSide);
            }

            return(expression);
        }