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); }