private Node ParseShift() { var lNode = this.ParseAdditive(); while (this.AreMoreTokens) { if (this.currentToken.Equals(TokenType.Symbol, "<<")) { this.ReadNextToken(); lNode = new ShiftLeftNode(lNode, this.ParseAdditive()); } else if (this.currentToken.Equals(TokenType.Symbol, ">>")) { this.ReadNextToken(); lNode = new ShiftRightNode(lNode, this.ParseAdditive()); } else { break; } } return(lNode); }
/* shift-expression-p: | expression-shift-operator additive-expression shift-expression-p | EPSILON */ private ExpressionNode shift_expression_p(ExpressionNode leftExpression) { printIfDebug("shift_expression_p"); if (pass(shiftOperatorOptions)) { Token shiftOperator = token; consumeToken(); var additiveExpression = additive_expression(); ExpressionNode resultExpression = null; if (shiftOperator.type == TokenType.OP_SHIFT_LEFT) { resultExpression = new ShiftLeftNode(leftExpression, additiveExpression, shiftOperator); } else { resultExpression = new ShiftRightNode(leftExpression, additiveExpression, shiftOperator); } return(shift_expression_p(resultExpression)); } else { return(leftExpression); } }