let analyze ast =
        let analyze_all env ast =
                let (rast, env) = analyze_variables env ast
                in let (rast, env) =
                        (rast, {
                                        globals = env.globals;
                                        num_globals = env.num_globals;
                                        locals = env.locals;
                                        num_locals = env.num_locals;
                                        sdepth = env.sdepth;
                                        max_depth = env.max_depth;
                                        errors = env.errors;
                                        warnings = env.warnings;
                                        unique_id = env.unique_id;
                                        names = List.rev env.names;
                                        varprops = env.varprops;
                                        imported = env.imported;
                                        templates = env.templates;
                                        constants = env.constants;
                                })
                in let (rast, env) = (pass2 env rast, env)
                in let _ = check_errors env
                in let env = check_warnings env
                in (rast, env)
        in let env = Environment.new_analysis_environment()
        in let env = Library.register_for_analysis env
        in analyze_all env ast