private ExpressionNode Expression() throws SyntaxException {
        try {
            ExpressionNode result = BoolExpression();

            while (iterator.current().type().is(Token.Type.Assignment)) {
                BinaryOperationNode.Operation operation = null;
                Position pos = iterator.current().coordinates().starting();
                switch (iterator.current().type()) {
                    case ASSIGN:
                        operation = 
                            BinaryOperationNode.Operation.ASSIGN;
                        break;
                    case PLUS_ASSIGN:
                        operation = 
                            BinaryOperationNode.Operation.PLUS_ASSIGN;
                        break;
                    case MINUS_ASSIGN:
                        operation = 
                            BinaryOperationNode.Operation.MINUS_ASSIGN;
                        break;
                    case MUL_ASSIGN:
                        operation = 
                            BinaryOperationNode.Operation.MUL_ASSIGN;
                        break;
                    case DIV_ASSIGN:
                        operation = 
                            BinaryOperationNode.Operation.DIV_ASSIGN;
                        break;
                    case MOD_ASSIGN:
                        operation = 
                            BinaryOperationNode.Operation.MOD_ASSIGN;
                        break;
                    case BITWISE_OR_ASSIGN:
                        operation = 
                            BinaryOperationNode.Operation.BITWISE_OR_ASSIGN;
                        break;
                    case BITWISE_SHIFT_LEFT_ASSIGN:
                        operation = 
                            BinaryOperationNode.Operation.BITWISE_SHIFT_LEFT_ASSIGN;
                        break;
                    case BITWISE_SHIFT_RIGHT_ASSIGN:
                        operation = 
                            BinaryOperationNode.Operation.BITWISE_SHIFT_RIGHT_ASSIGN;
                        break;
                    case BITWISE_XOR_ASSIGN:
                        operation =
                            BinaryOperationNode.Operation.BITWISE_XOR_ASSIGN;
                        break;
                    case BITWISE_AND_ASSIGN:
                        operation = 
                            BinaryOperationNode.Operation.BITWISE_AND_ASSIGN;
                        break;
                    default:
                        return BinaryOperationNode.InvalidNode(pos);
                }
                nextToken();

                ExpressionNode right = BoolExpression();

                result = new BinaryOperationNode(operation, result, right, pos);
            }

            return result;
        } catch(SyntaxException ex) {
            throw ex;
        } catch(Exception ex) {
            throw (NonAnalysisException)new NonAnalysisException(ex)
                    .initPosition(iterator.current().coordinates().starting())
                    .Log("ru.bmstu.iu9.compiler.syntax");
        }
    }