- free_conflicts ();
- free_nullable ();
- free_derives ();
-
- output_files ();
-
- exit (complain_message_count ? 1 : 0);
-}
-\f
-/* Abort for an internal error denoted by string S. */
-
-void
-berror (const char *s)
-{
- fprintf (stderr, _("%s: internal error: %s\n"), program_name, s);
- abort ();
+ conflicts_free ();
+ grammar_free ();
+ output_file_names_free ();
+
+ /* The scanner memory cannot be released right after parsing, as it
+ contains things such as user actions, prologue, epilogue etc. */
+ gram_scanner_free ();
+ muscle_free ();
+ uniqstrs_free ();
+ code_scanner_free ();
+ skel_scanner_free ();
+ quotearg_free ();
+ timevar_pop (TV_FREE);
+
+ if (trace_flag & trace_bitsets)
+ bitset_stats_dump (stderr);
+
+ finish:
+
+ /* Stop timing and print the times. */
+ timevar_stop (TV_TOTAL);
+ timevar_print (stderr);
+
+ return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;