-void
-berror (const char *s)
-{
- fprintf (stderr, _("%s: internal error: %s\n"), program_name, s);
- abort ();
+ /* Stop if there were errors, to avoid trashing previous output
+ files. */
+ if (complaint_issued)
+ goto finish;
+
+ /* Lookahead tokens are no longer needed. */
+ timevar_push (TV_FREE);
+ lalr_free ();
+ timevar_pop (TV_FREE);
+
+ /* Output the tables and the parser to ftable. In file output. */
+ timevar_push (TV_PARSER);
+ output ();
+ timevar_pop (TV_PARSER);
+
+ timevar_push (TV_FREE);
+ nullable_free ();
+ derives_free ();
+ tables_free ();
+ states_free ();
+ reduce_free ();
+ 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;