]> git.saurik.com Git - bison.git/blobdiff - src/output.c
* src/reader.c (copy_comment2): Expect the input stream to be on
[bison.git] / src / output.c
index 20b33618b8f08e68ca86977415df62a792c6651b..a426ad8f94f5bcddb5706296a49777c1f07103a6 100644 (file)
 
 #include "system.h"
 #include "getargs.h"
-#include "alloc.h"
+#include "xalloc.h"
 #include "files.h"
 #include "gram.h"
-#include "state.h"
+#include "LR0.h"
 #include "complain.h"
 #include "output.h"
 #include "lalr.h"
 #include "reader.h"
+#include "conflicts.h"
 
 extern void berror PARAMS((const char *));
 
-extern char **tags;
-extern short *user_toknums;
-extern int final_state;
-extern errs **err_table;
 
 
 static int nvectors;
@@ -206,7 +203,7 @@ output_headers (void)
   if (semantic_parser)
     fprintf (fguard, GUARDSTR, attrsfile);
 
-  if (noparserflag)
+  if (no_parser_flag)
     return;
 
   fprintf (faction, (semantic_parser ? ACTSTR : ACTSTR_SIMPLE), attrsfile);
@@ -241,7 +238,7 @@ output_trailers (void)
 
   fprintf (faction, "\n");
 
-  if (noparserflag)
+  if (no_parser_flag)
     return;
 
   if (semantic_parser)
@@ -303,8 +300,8 @@ output_gram (void)
 
   /* With the ordinary parser,
      yyprhs and yyrhs are needed only for yydebug. */
-  /* With the noparser option, all tables are generated */
-  if (!semantic_parser && !noparserflag)
+  /* With the no_parser option, all tables are generated */
+  if (!semantic_parser && !no_parser_flag)
     fprintf (ftable, "\n#if YYDEBUG != 0\n");
 
   output_short_table (ftable, "yyprhs", rrhs,
@@ -335,7 +332,7 @@ output_gram (void)
 
   fprintf (ftable, "\n};\n");
 
-  if (!semantic_parser && !noparserflag)
+  if (!semantic_parser && !no_parser_flag)
     fprintf (ftable, "\n#endif\n");
 }
 
@@ -364,7 +361,7 @@ output_rule_data (void)
 
   fputs ("#endif\n\n", ftable);
 
-  if (toknumflag || noparserflag)
+  if (token_table_flag || no_parser_flag)
     {
       fprintf (ftable, "#define YYNTOKENS %d\n", ntokens);
       fprintf (ftable, "#define YYNNTS %d\n", nvars);
@@ -373,7 +370,7 @@ output_rule_data (void)
       fprintf (ftable, "#define YYMAXUTOK %d\n\n", max_user_token_number);
     }
 
-  if (!toknumflag && !noparserflag)
+  if (!token_table_flag && !no_parser_flag)
     fprintf (ftable, "\n#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)\n\n");
 
   /* Output the table of symbol names.  */
@@ -439,11 +436,11 @@ output_rule_data (void)
   /* add a NULL entry to list of tokens */
   fprintf (ftable, ", NULL\n};\n");
 
-  if (!toknumflag && !noparserflag)
+  if (!token_table_flag && !no_parser_flag)
     fprintf (ftable, "#endif\n\n");
 
   /* Output YYTOKNUM. */
-  if (toknumflag)
+  if (token_table_flag)
     {
       output_short_table (ftable, "yytoknum", user_toknums,
                          0, 1, ntokens + 1);
@@ -455,7 +452,7 @@ output_rule_data (void)
 
   output_short_table (ftable, "yyr1", rlhs,
                      0, 1, nrules + 1);
-  FREE (rlhs + 1);
+  XFREE (rlhs + 1);
 
   putc ('\n', ftable);
 
@@ -486,7 +483,7 @@ static const short yyr2[] = {     0", ftable);
     putc ('\n', ftable);
 
   fprintf (ftable, "%6d\n};\n", nitems - rrhs[nrules] - 1);
-  FREE (rrhs + 1);
+  XFREE (rrhs + 1);
 }
 
 
@@ -702,8 +699,8 @@ save_row (int state)
   if (count == 0)
     return;
 
-  froms[state] = sp1 = sp = NEW2 (count, short);
-  tos[state] = sp2 = NEW2 (count, short);
+  froms[state] = sp1 = sp = XCALLOC (short, count);
+  tos[state] = sp2 = XCALLOC (short, count);
 
   for (i = 0; i < ntokens; i++)
     {
@@ -731,19 +728,19 @@ static void
 token_actions (void)
 {
   int i;
-  short *yydefact = NEW2 (nstates, short);
+  short *yydefact = XCALLOC (short, nstates);
 
-  actrow = NEW2 (ntokens, short);
+  actrow = XCALLOC (short, ntokens);
   for (i = 0; i < nstates; ++i)
     {
       yydefact[i] = action_row (i);
       save_row (i);
     }
-  FREE (actrow);
+  XFREE (actrow);
 
   output_short_table (ftable, "yydefact", yydefact,
                      yydefact[0], 1, nstates);
-  FREE (yydefact);
+  XFREE (yydefact);
 }
 
 
@@ -752,12 +749,12 @@ free_shifts (void)
 {
   shifts *sp, *sptmp;  /* JF derefrenced freed ptr */
 
-  FREE (shift_table);
+  XFREE (shift_table);
 
   for (sp = first_shift; sp; sp = sptmp)
     {
       sptmp = sp->next;
-      FREE (sp);
+      XFREE (sp);
     }
 }
 
@@ -767,12 +764,12 @@ free_reductions (void)
 {
   reductions *rp, *rptmp;      /* JF fixed freed ptr */
 
-  FREE (reduction_table);
+  XFREE (reduction_table);
 
   for (rp = first_reduction; rp; rp = rptmp)
     {
       rptmp = rp->next;
-      FREE (rp);
+      XFREE (rp);
     }
 }
 
@@ -805,8 +802,8 @@ save_column (int symbol, int default_state)
 
   symno = symbol - ntokens + nstates;
 
-  froms[symno] = sp1 = sp = NEW2 (count, short);
-  tos[symno] = sp2 = NEW2 (count, short);
+  froms[symno] = sp1 = sp = XCALLOC (short, count);
+  tos[symno] = sp2 = XCALLOC (short, count);
 
   for (i = m; i < n; i++)
     {
@@ -872,7 +869,7 @@ goto_actions (void)
 {
   int i, j, k;
 
-  state_count = NEW2 (nstates, short);
+  state_count = XCALLOC (short, nstates);
 
   k = default_goto (ntokens);
   fprintf (ftable, "\nstatic const short yydefgoto[] = {%6d", k);
@@ -899,7 +896,7 @@ goto_actions (void)
     }
 
   fprintf (ftable, "\n};\n");
-  FREE (state_count);
+  XFREE (state_count);
 }
 
 
@@ -915,7 +912,7 @@ sort_actions (void)
   int t;
   int w;
 
-  order = NEW2 (nvectors, short);
+  order = XCALLOC (short, nvectors);
   nentries = 0;
 
   for (i = 0; i < nvectors; i++)
@@ -996,8 +993,7 @@ pack_vector (int vector)
   i = order[vector];
   t = tally[i];
 
-  if (t == 0)
-    berror ("pack_vector");
+  assert (t);
 
   from = froms[i];
   to = tos[i];
@@ -1053,10 +1049,10 @@ pack_table (void)
   int place;
   int state;
 
-  base = NEW2 (nvectors, short);
-  pos = NEW2 (nentries, short);
-  table = NEW2 (MAXTABLE, short);
-  check = NEW2 (MAXTABLE, short);
+  base = XCALLOC (short, nvectors);
+  pos = XCALLOC (short, nentries);
+  table = XCALLOC (short, MAXTABLE);
+  check = XCALLOC (short, MAXTABLE);
 
   lowzero = 0;
   high = 0;
@@ -1083,14 +1079,14 @@ pack_table (void)
   for (i = 0; i < nvectors; i++)
     {
       if (froms[i])
-       FREE (froms[i]);
+       XFREE (froms[i]);
       if (tos[i])
-       FREE (tos[i]);
+       XFREE (tos[i]);
     }
 
-  FREE (froms);
-  FREE (tos);
-  FREE (pos);
+  XFREE (froms);
+  XFREE (tos);
+  XFREE (pos);
 }
 
 /* the following functions output yytable, yycheck
@@ -1107,7 +1103,7 @@ output_base (void)
   output_short_table (ftable, "yypgoto", base,
                      base[nstates], nstates + 1, nvectors);
 
-  FREE (base);
+  XFREE (base);
 }
 
 
@@ -1117,7 +1113,7 @@ output_table (void)
   fprintf (ftable, "\n\n#define\tYYLAST\t\t%d\n\n\n", high);
   output_short_table (ftable, "yytable", table,
                      table[0], 1, high + 1);
-  FREE (table);
+  XFREE (table);
 }
 
 
@@ -1126,7 +1122,7 @@ output_check (void)
 {
   output_short_table (ftable, "yycheck", check,
                      check[0], 1, high + 1);
-  FREE (check);
+  XFREE (check);
 }
 
 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
@@ -1137,23 +1133,23 @@ output_actions (void)
 {
   nvectors = nstates + nvars;
 
-  froms = NEW2 (nvectors, short *);
-  tos = NEW2 (nvectors, short *);
-  tally = NEW2 (nvectors, short);
-  width = NEW2 (nvectors, short);
+  froms = XCALLOC (short *, nvectors);
+  tos = XCALLOC (short *, nvectors);
+  tally = XCALLOC (short, nvectors);
+  width = XCALLOC (short, nvectors);
 
   token_actions ();
   free_shifts ();
   free_reductions ();
-  FREE (lookaheads);
-  FREE (LA);
-  FREE (LAruleno);
-  FREE (accessing_symbol);
+  XFREE (lookaheads);
+  XFREE (LA);
+  XFREE (LAruleno);
+  XFREE (accessing_symbol);
 
   goto_actions ();
-  FREE (goto_map + ntokens);
-  FREE (from_state);
-  FREE (to_state);
+  XFREE (goto_map + ntokens);
+  XFREE (from_state);
+  XFREE (to_state);
 
   sort_actions ();
   pack_table ();
@@ -1170,6 +1166,7 @@ static void
 output_parser (void)
 {
   int c;
+  static int number_of_dollar_signs = 0;
 #ifdef DONTDEF
   FILE *fpars;
 #else
@@ -1179,8 +1176,9 @@ output_parser (void)
   if (pure_parser)
     fprintf (ftable, "#define YYPURE 1\n\n");
 
-#ifdef DONTDEF                 /* JF no longer needed 'cuz open_extra_files changes the
-                                  currently open parser from bison.simple to bison.hairy */
+#ifdef DONTDEF
+  /* JF no longer needed 'cuz open_extra_files changes the currently
+     open parser from bison.simple to bison.hairy */
   if (semantic_parser)
     fpars = fparser;
   else
@@ -1197,7 +1195,7 @@ output_parser (void)
 
       /* See if the line starts with `#line.
          If so, set write_line to 0.  */
-      if (nolinesflag)
+      if (no_lines_flag)
        if (c == '#')
          {
            c = getc (fpars);
@@ -1231,11 +1229,15 @@ output_parser (void)
          {
            if (c == '$')
              {
+               number_of_dollar_signs++;
+               assert (number_of_dollar_signs == 1);
                /* `$' in the parser file indicates where to put the actions.
                   Copy them in at this point.  */
                rewind (faction);
                for (c = getc (faction); c != EOF; c = getc (faction))
                  putc (c, ftable);
+               /* Skip the end of the line containing `$'. */
+               write_line = 0;
              }
            else
              putc (c, ftable);
@@ -1244,6 +1246,7 @@ output_parser (void)
        break;
       putc (c, ftable);
     }
+  assert (number_of_dollar_signs == 1);
 }
 
 static void
@@ -1251,7 +1254,7 @@ output_program (void)
 {
   int c;
 
-  if (!nolinesflag)
+  if (!no_lines_flag)
     fprintf (ftable, "#line %d \"%s\"\n", lineno, infile);
 
   c = getc (finput);
@@ -1268,12 +1271,12 @@ free_itemsets (void)
 {
   core *cp, *cptmp;
 
-  FREE (state_table);
+  XFREE (state_table);
 
   for (cp = first_state; cp; cp = cptmp)
     {
       cptmp = cp->next;
-      FREE (cp);
+      XFREE (cp);
     }
 }
 
@@ -1295,10 +1298,10 @@ output (void)
        putc (c, ftable);
     }
   reader_output_yylsp (ftable);
-  if (debugflag)
+  if (debug_flag)
     fputs ("\
 #ifndef YYDEBUG\n\
-#define YYDEBUG 1\n\
+# define YYDEBUG 1\n\
 #endif\n\
 \n",
           ftable);
@@ -1306,7 +1309,7 @@ output (void)
   if (semantic_parser)
     fprintf (ftable, "#include \"%s\"\n", attrsfile);
 
-  if (!noparserflag)
+  if (!no_parser_flag)
     fprintf (ftable, "#include <stdio.h>\n\n");
 
   /* Make "const" do nothing if not in ANSI C.  */
@@ -1325,12 +1328,12 @@ output (void)
 /*   if (semantic_parser) */
   /* This is now unconditional because debugging printouts can use it.  */
   output_gram ();
-  FREE (ritem);
+  XFREE (ritem);
   if (semantic_parser)
     output_stos ();
   output_rule_data ();
   output_actions ();
-  if (!noparserflag)
+  if (!no_parser_flag)
     output_parser ();
   output_program ();
 }