extern int verboseflag;
 
+#if 0                           /* XXX currently unused.  */
 /* Nonzero means failure has been detected; don't write a parser file.  */
-int failure;
+static int failure;
+#endif
 
 /* The name this program was run with, for messages.  */
 char *program_name;
 
-char *printable_version PARAMS((int));
-void toomany PARAMS((char *));
-void berror PARAMS((char *));
+extern char *printable_version PARAMS((int));
+extern void berror PARAMS((const char *));
 
 extern void getargs PARAMS((int, char *[]));
 extern void openfiles PARAMS((void));
 extern void reader PARAMS((void));
 extern void reduce_grammar PARAMS((void));
 extern void set_derives PARAMS((void));
+extern void free_derives PARAMS((void));
 extern void set_nullable PARAMS((void));
 extern void generate_states PARAMS((void));
 extern void lalr PARAMS((void));
 extern void initialize_conflicts PARAMS((void));
+extern void finalize_conflicts PARAMS((void));
 extern void verbose PARAMS((void));
 extern void terse PARAMS((void));
 extern void output PARAMS((void));
   /* output the tables and the parser to ftable.  In file output. */
   output();
 
+  finalize_conflicts();
+  free_derives();
+
   exit (complain_message_count ? 1 : 0);
 }
 \f
 /* Abort for an internal error denoted by string S.  */
 
 void
-berror (char *s)
+berror (const char *s)
 {
   fprintf (stderr, _("%s: internal error: %s\n"), program_name, s);
   abort();