// Returns NExprBitShift or any of subproduction nodes public Node ExprBitShift() { Node resultingNode = ExprAdd(); while (CurrentToken == TokenCategory.SHIFT_LEFT || CurrentToken == TokenCategory.SHIFT_RIGHT || CurrentToken == TokenCategory.SHIFT_RIGHT_ALT) { NExprBitShift tmp = new NExprBitShift(); tmp.Add(resultingNode); resultingNode = tmp; switch (CurrentToken) { case TokenCategory.SHIFT_LEFT: { resultingNode.AnchorToken = Expect(TokenCategory.SHIFT_LEFT); resultingNode.Add(ExprAdd()); break; } case TokenCategory.SHIFT_RIGHT: { resultingNode.AnchorToken = Expect(TokenCategory.SHIFT_RIGHT); resultingNode.Add(ExprAdd()); break; } case TokenCategory.SHIFT_RIGHT_ALT: { resultingNode.AnchorToken = Expect(TokenCategory.SHIFT_RIGHT_ALT); resultingNode.Add(ExprAdd()); break; } // Default case would be unreachable } } return(resultingNode); }