]> git.saurik.com Git - bison.git/commitdiff
* src/system.h (obstack_grow_literal_string): Rename as...
authorAkim Demaille <akim@epita.fr>
Tue, 19 Dec 2000 14:51:24 +0000 (14:51 +0000)
committerAkim Demaille <akim@epita.fr>
Tue, 19 Dec 2000 14:51:24 +0000 (14:51 +0000)
(obstack_grow_string): this.
* src/output.c (output_parser): Recognize `%% actions' instead of
`$'.
* src/bison.s1: s/$/%% actions/.
* src/bison.hairy: Likewise.

ChangeLog
src/bison.hairy
src/bison.s1
src/bison.simple
src/output.c
src/reader.c
src/system.h

index 256dac8888cfb0363d8fb75cac2a45e2914a44d6..1f1236b426b23711609c8ba3a7e942a02f378f11 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2000-12-19  Akim Demaille  <akim@epita.fr>
+
+       * src/system.h (obstack_grow_literal_string): Rename as...
+       (obstack_grow_string): this.
+       * src/output.c (output_parser): Recognize `%% actions' instead of
+       `$'.
+       * src/bison.s1: s/$/%% actions/.
+       * src/bison.hairy: Likewise.
+
 2000-12-19  Akim Demaille  <akim@epita.fr>
 
        * src/output.c (output_parser): Compute the `#line' lines when
index 999b55591d01c856263bc0172a1cc243c97dc875..3acb54bc82f5d4ed6297f4efb654671eadc8fbfe 100644 (file)
@@ -1,4 +1,4 @@
-
+                                                          /* -*- C -*- */
 extern int timeclock;
 
 
@@ -261,7 +261,7 @@ yyresume:
          yylsp->last_line = (yylsp+yylen-1)->last_line;
          yylsp->last_column = (yylsp+yylen-1)->last_column;
        }
-         
+
       if (yyptr == yyrq + YYMAXRULES)
         yyptr = yyrq;
     }
@@ -331,4 +331,4 @@ yyerrlab:
   goto yyresume;
 }
 
-$
+%% actions
index 0117220a48f3479404b9c95bf29e967fd59debd4..2a0f0b194145edca898b8c554bb136f8a6931c6b 100644 (file)
 # define YYSTACK_ALLOC malloc
 #endif
 
-/* Note: there must be only one dollar sign in this file.
-   It is replaced by the list of actions, each action
-   as one case of the switch.  */
-
 #define yyerrok                (yyerrstatus = 0)
 #define yyclearin      (yychar = YYEMPTY)
 #define YYEMPTY                -2
@@ -583,7 +579,7 @@ yyreduce:
   yylen = yyr2[yyn];
 
   /* If YYLEN is nonzero, implement the default value of the action:
-     `{dollar}{dollar} = {dollar}1'.
+     `$$ = $1'.
 
      Otherwise, the following line sets YYVAL to the semantic value of
      the lookahead token.  This behavior is undocumented and Bison
@@ -615,7 +611,7 @@ yyreduce:
       fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
     }
 #endif
-$ /* The action file replaces this line marked with this dollarsign. */
+%% actions /* The action file replaces this line. */
 #line
 \f
   yyvsp -= yylen;
index 0117220a48f3479404b9c95bf29e967fd59debd4..2a0f0b194145edca898b8c554bb136f8a6931c6b 100644 (file)
 # define YYSTACK_ALLOC malloc
 #endif
 
-/* Note: there must be only one dollar sign in this file.
-   It is replaced by the list of actions, each action
-   as one case of the switch.  */
-
 #define yyerrok                (yyerrstatus = 0)
 #define yyclearin      (yychar = YYEMPTY)
 #define YYEMPTY                -2
@@ -583,7 +579,7 @@ yyreduce:
   yylen = yyr2[yyn];
 
   /* If YYLEN is nonzero, implement the default value of the action:
-     `{dollar}{dollar} = {dollar}1'.
+     `$$ = $1'.
 
      Otherwise, the following line sets YYVAL to the semantic value of
      the lookahead token.  This behavior is undocumented and Bison
@@ -615,7 +611,7 @@ yyreduce:
       fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
     }
 #endif
-$ /* The action file replaces this line marked with this dollarsign. */
+%% actions /* The action file replaces this line. */
 #line
 \f
   yyvsp -= yylen;
index adef04336fdf8812b71d4772c74b9e5c474f8d93..609d980163d99c222a0514fc8e7842e4db84ec36 100644 (file)
@@ -150,7 +150,7 @@ output_short_or_char_table (struct obstack *oout,
 
       if (j >= 10)
        {
-         obstack_grow_literal_string (oout, "\n  ");
+         obstack_grow_string (oout, "\n  ");
          j = 1;
        }
       else
@@ -161,7 +161,7 @@ output_short_or_char_table (struct obstack *oout,
       obstack_fgrow1 (oout, "%6d", short_table[i]);
     }
 
-  obstack_grow_literal_string (oout, "\n};\n");
+  obstack_grow_string (oout, "\n};\n");
 }
 
 
@@ -234,7 +234,7 @@ output_headers (void)
   if (semantic_parser)
     obstack_fgrow1 (&action_obstack, ACTSTR, attrsfile_quoted);
   else
-    obstack_grow_literal_string (&action_obstack, ACTSTR_SIMPLE);
+    obstack_grow_string (&action_obstack, ACTSTR_SIMPLE);
 
 /*  if (semantic_parser)       JF moved this below
     fprintf(ftable, "#include \"%s\"\n", attrsfile);
@@ -278,9 +278,9 @@ output_trailers (void)
     return;
 
   if (semantic_parser)
-    obstack_grow_literal_string (&action_obstack, "    }\n");
+    obstack_grow_string (&action_obstack, "    }\n");
 
-  obstack_grow_literal_string (&action_obstack, "}\n");
+  obstack_grow_string (&action_obstack, "}\n");
 }
 
 
@@ -288,7 +288,7 @@ output_trailers (void)
 static void
 output_token_translations (void)
 {
-  obstack_grow_literal_string (&table_obstack, "\
+  obstack_grow_string (&table_obstack, "\
 \n\
 /* YYRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */\n");
 
@@ -308,8 +308,8 @@ output_token_translations (void)
     }
   else
     {
-      obstack_grow_literal_string (&table_obstack,
-                                  "\n#define YYTRANSLATE(x) (x)\n");
+      obstack_grow_string (&table_obstack,
+                          "\n#define YYTRANSLATE(x) (x)\n");
     }
 }
 
@@ -321,7 +321,7 @@ output_gram (void)
      yyprhs and yyrhs are needed only for yydebug. */
   /* With the no_parser option, all tables are generated */
   if (!semantic_parser && !no_parser_flag)
-    obstack_grow_literal_string (&table_obstack, "\n#if YYDEBUG != 0\n");
+    obstack_grow_string (&table_obstack, "\n#if YYDEBUG != 0\n");
 
   output_short_table (&table_obstack, NULL, "yyprhs", rrhs,
                      0, 1, nrules + 1);
@@ -344,7 +344,7 @@ output_gram (void)
   }
 
   if (!semantic_parser && !no_parser_flag)
-    obstack_grow_literal_string (&table_obstack, "\n#endif\n");
+    obstack_grow_string (&table_obstack, "\n#endif\n");
 }
 
 
@@ -363,7 +363,7 @@ output_rule_data (void)
   int j;
   short *short_tab = NULL;
 
-  obstack_grow_literal_string (&table_obstack, "\n\
+  obstack_grow_string (&table_obstack, "\n\
 #if YYDEBUG != 0\n");
 
   output_short_table (&table_obstack,
@@ -371,7 +371,7 @@ output_rule_data (void)
                      "yyrline", rline,
                      0, 1, nrules + 1);
 
-  obstack_grow_literal_string (&table_obstack, "#endif\n\n");
+  obstack_grow_string (&table_obstack, "#endif\n\n");
 
   if (token_table_flag || no_parser_flag)
     {
@@ -385,11 +385,11 @@ output_rule_data (void)
 
   /* Output the table of symbol names.  */
   if (!token_table_flag && !no_parser_flag)
-    obstack_grow_literal_string (&table_obstack,
-                         "\n#if YYDEBUG != 0 || defined YYERROR_VERBOSE\n\n");
-  obstack_grow_literal_string (&table_obstack, "\
+    obstack_grow_string (&table_obstack,
+                        "\n#if YYDEBUG != 0 || defined YYERROR_VERBOSE\n\n");
+  obstack_grow_string (&table_obstack, "\
 /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */\n");
-  obstack_grow_literal_string (&table_obstack,
+  obstack_grow_string (&table_obstack,
           "static const char *const yytname[] =\n{\n  ");
 
   j = 0;
@@ -413,7 +413,7 @@ output_rule_data (void)
 
       if (j + strsize > 75)
        {
-         obstack_grow_literal_string (&table_obstack, "\n  ");
+         obstack_grow_string (&table_obstack, "\n  ");
          j = 2;
        }
 
@@ -421,39 +421,27 @@ output_rule_data (void)
       for (p = tags[i]; p && *p; p++)
        {
          if (*p == '"' || *p == '\\')
-           {
-             obstack_fgrow1 (&table_obstack, "\\%c", *p);
-           }
+           obstack_fgrow1 (&table_obstack, "\\%c", *p);
          else if (*p == '\n')
-           {
-             obstack_grow_literal_string (&table_obstack, "\\n");
-           }
+           obstack_grow_string (&table_obstack, "\\n");
          else if (*p == '\t')
-           {
-             obstack_grow_literal_string (&table_obstack, "\\t");
-           }
+           obstack_grow_string (&table_obstack, "\\t");
          else if (*p == '\b')
-           {
-             obstack_grow_literal_string (&table_obstack, "\\b");
-           }
+           obstack_grow_string (&table_obstack, "\\b");
          else if (*p < 040 || *p >= 0177)
-           {
-             obstack_fgrow1 (&table_obstack, "\\%03o", *p);
-           }
+           obstack_fgrow1 (&table_obstack, "\\%03o", *p);
          else
-           {
-             obstack_1grow (&table_obstack, *p);
-           }
+           obstack_1grow (&table_obstack, *p);
        }
 
-      obstack_grow_literal_string (&table_obstack, "\", ");
+      obstack_grow_string (&table_obstack, "\", ");
       j += strsize;
     }
   /* add a NULL entry to list of tokens */
-  obstack_grow_literal_string (&table_obstack, "NULL\n};\n");
+  obstack_grow_string (&table_obstack, "NULL\n};\n");
 
   if (!token_table_flag && !no_parser_flag)
-    obstack_grow_literal_string (&table_obstack, "#endif\n\n");
+    obstack_grow_string (&table_obstack, "#endif\n\n");
 
   /* Output YYTOKNUM. */
   if (token_table_flag)
@@ -1164,10 +1152,10 @@ output_parser (void)
   FILE *fskel;
   size_t line;
   const char *skeleton = NULL;
-  int number_of_dollar_signs = 0;
+  int actions_dumped = 0;
 
   if (pure_parser)
-    obstack_grow_literal_string (&table_obstack, "#define YYPURE 1\n\n");
+    obstack_grow_string (&table_obstack, "#define YYPURE 1\n\n");
 
   /* Loop over lines in the standard parser file.  */
   if (semantic_parser)
@@ -1184,63 +1172,106 @@ output_parser (void)
 
   while (1)
     {
-      int is_sync_line = 0;
-      int write_line = 1;
+      enum line_type_e
+       {
+         regular_line,
+         sync_line,    /* #line. */
+         actions_line  /* %% actions. */
+       };
+      enum line_type_e line_type = regular_line;
 
       c = getc (fskel);
 
-      /* See if the line starts with `#line'. */
+      /* Is this line special? */
       if (c == '#')
-       if ((c = getc (fskel)) == 'l')
-         if ((c = getc (fskel)) == 'i')
-           if ((c = getc (fskel)) == 'n')
-             if ((c = getc (fskel)) == 'e')
-               is_sync_line = 1;
+       {
+         /* See if it's a `#line' line. */
+         if ((c = getc (fskel)) == 'l')
+           if ((c = getc (fskel)) == 'i')
+             if ((c = getc (fskel)) == 'n')
+               if ((c = getc (fskel)) == 'e')
+                 line_type = sync_line;
+               else
+                 obstack_grow_string (&table_obstack, "#lin");
              else
-               obstack_grow_literal_string (&table_obstack, "#lin");
+               obstack_grow_string (&table_obstack, "#li");
            else
-             obstack_grow_literal_string (&table_obstack, "#li");
+             obstack_grow_string (&table_obstack, "#l");
          else
-           obstack_grow_literal_string (&table_obstack, "#l");
-       else
-         obstack_grow_literal_string (&table_obstack, "#");
+           obstack_grow_string (&table_obstack, "#");
+       }
+      else if (c == '%')
+       {
+         /* See if it's a `%% actions' line. */
+         if ((c = getc (fskel)) == '%')
+           if ((c = getc (fskel)) == ' ')
+             if ((c = getc (fskel)) == 'a')
+               if ((c = getc (fskel)) == 'c')
+                 if ((c = getc (fskel)) == 't')
+                   if ((c = getc (fskel)) == 'i')
+                     if ((c = getc (fskel)) == 'o')
+                       if ((c = getc (fskel)) == 'n')
+                         if ((c = getc (fskel)) == 's')
+                           line_type = actions_line;
+                         else
+                           obstack_grow_string (&table_obstack, "%% action");
+                       else
+                         obstack_grow_string (&table_obstack, "%% actio");
+                     else
+                       obstack_grow_string (&table_obstack, "%% acti");
+                   else
+                     obstack_grow_string (&table_obstack, "%% act");
+                 else
+                   obstack_grow_string (&table_obstack, "%% ac");
+               else
+                 obstack_grow_string (&table_obstack, "%% a");
+             else
+               obstack_grow_string (&table_obstack, "%% ");
+           else
+             obstack_grow_string (&table_obstack, "%%");
+         else
+           obstack_grow_string (&table_obstack, "%");
+       }
 
-      /* If was a `#line' line, either compute it, or drop it. */
-      if (is_sync_line && !no_lines_flag)
-       obstack_fgrow2 (&table_obstack, "#line %d %s\n",
-                       line, quotearg_style (c_quoting_style, skeleton));
+      switch (line_type)
+       {
+       case sync_line:
+         if (!no_lines_flag)
+           obstack_fgrow2 (&table_obstack, "#line %d %s\n",
+                           line, quotearg_style (c_quoting_style, skeleton));
 
-      if (is_sync_line)
-       write_line = 0;
+         /* Skip the end of line. */
+         for (; c != '\n' && c != EOF; c = getc (fskel))
+           /* nothing */;
+         break;
 
-      /* now write out the line... */
-      for (; c != '\n' && c != EOF; c = getc (fskel))
-       if (write_line)
+       case actions_line:
          {
-           /* `$' in the parser file indicates where to put the
-              actions.  Copy them in at this point.  */
-           if (c == '$')
-             {
-               size_t size = obstack_object_size (&action_obstack);
-
-               number_of_dollar_signs++;
-               assert (number_of_dollar_signs == 1);
-               obstack_grow (&table_obstack,
-                             obstack_finish (&action_obstack),
-                             size);
-
-               /* Skip the end of the line containing `$'. */
-               write_line = 0;
-             }
-           else
-             obstack_1grow (&table_obstack, c);
+           size_t size = obstack_object_size (&action_obstack);
+
+           actions_dumped++;
+           assert (actions_dumped == 1);
+           obstack_grow (&table_obstack,
+                         obstack_finish (&action_obstack),
+                         size);
          }
+
+         /* Skip the end of line. */
+         for (; c != '\n' && c != EOF; c = getc (fskel))
+           /* nothing */;
+         break;
+
+       case regular_line:
+         for (; c != '\n' && c != EOF; c = getc (fskel))
+           obstack_1grow (&table_obstack, c);
+       }
+
       if (c == EOF)
        break;
       obstack_1grow (&table_obstack, c);
       line++;
     }
-  assert (number_of_dollar_signs == 1);
+  assert (actions_dumped == 1);
   xfclose (fskel);
 }
 
@@ -1291,7 +1322,7 @@ output (void)
     }
   reader_output_yylsp (&table_obstack);
   if (debug_flag)
-    obstack_grow_literal_string (&table_obstack, "\
+    obstack_grow_string (&table_obstack, "\
 #ifndef YYDEBUG\n\
 # define YYDEBUG 1\n\
 #endif\n\
@@ -1302,10 +1333,10 @@ output (void)
                    quotearg_style (c_quoting_style, attrsfile));
 
   if (!no_parser_flag)
-    obstack_grow_literal_string (&table_obstack, "#include <stdio.h>\n\n");
+    obstack_grow_string (&table_obstack, "#include <stdio.h>\n\n");
 
   /* Make "const" do nothing if not in ANSI C.  */
-  obstack_grow_literal_string (&table_obstack, "\
+  obstack_grow_string (&table_obstack, "\
 #ifndef __cplusplus\n\
 # ifndef __STDC__\n\
 #  define const\n\
index cc24af65904feb5b8755b6dfbde63ddc7510837e..156fa452ffc9b1660be1bda9ddee274f56d3aa1a 100644 (file)
@@ -343,7 +343,7 @@ copy_at (FILE *fin, FILE *fout, struct obstack *oout, int stack_offset)
       if (fout)
        fprintf (fout, "yyloc");
       if (oout)
-       obstack_grow_literal_string (oout, "yyloc");
+       obstack_grow_string (oout, "yyloc");
       locations_flag = 1;
     }
   else if (isdigit (c) || c == '-')
@@ -401,7 +401,7 @@ copy_dollar (FILE *fin, FILE *fout, struct obstack *oout,
       if (fout)
        fputs ("yyval", fout);
       if (oout)
-       obstack_grow_literal_string (oout, "yyval");
+       obstack_grow_string (oout, "yyval");
 
       if (!type_name)
        type_name = get_type_name (0, rule);
@@ -786,9 +786,9 @@ parse_union_decl (void)
   else
     obstack_1grow (&attrs_obstack, '\n');
 
-  obstack_grow_literal_string (&attrs_obstack, "typedef union");
+  obstack_grow_string (&attrs_obstack, "typedef union");
   if (defines_flag)
-    obstack_grow_literal_string (&defines_obstack, "typedef union");
+    obstack_grow_string (&defines_obstack, "typedef union");
 
   c = getc (finput);
 
@@ -818,9 +818,9 @@ parse_union_decl (void)
          count--;
          if (count <= 0)
            {
-             obstack_grow_literal_string (&attrs_obstack, " YYSTYPE;\n");
+             obstack_grow_string (&attrs_obstack, " YYSTYPE;\n");
              if (defines_flag)
-               obstack_grow_literal_string (&defines_obstack, " YYSTYPE;\n");
+               obstack_grow_string (&defines_obstack, " YYSTYPE;\n");
              /* JF don't choke on trailing semi */
              c = skip_white_space ();
              if (c != ';')
@@ -1117,8 +1117,7 @@ copy_action (symbol_list *rule, int stack_offset)
        }
     }
 
-  obstack_grow_literal_string (&action_obstack,
-                              ";\n    break;}");
+  obstack_grow_string (&action_obstack, ";\n    break;}");
 }
 \f
 /*-------------------------------------------------------------------.
@@ -1597,10 +1596,10 @@ readgram (void)
       /* We used to use `unsigned long' as YYSTYPE on MSDOS,
          but it seems better to be consistent.
          Most programs should declare their own type anyway.  */
-      obstack_grow_literal_string (&attrs_obstack,
-                           "#ifndef YYSTYPE\n#define YYSTYPE int\n#endif\n");
+      obstack_grow_string (&attrs_obstack,
+                          "#ifndef YYSTYPE\n#define YYSTYPE int\n#endif\n");
       if (defines_flag)
-       obstack_grow_literal_string (&defines_obstack, "\
+       obstack_grow_string (&defines_obstack, "\
 #ifndef YYSTYPE\n\
 # define YYSTYPE int\n\
 #endif\n");
@@ -1810,8 +1809,8 @@ packsymbols (void)
            obstack_fgrow1 (&defines_obstack, "\nextern YYSTYPE %slval;\n",
                            spec_name_prefix);
          else
-           obstack_grow_literal_string (&defines_obstack,
-                                        "\nextern YYSTYPE yylval;\n");
+           obstack_grow_string (&defines_obstack,
+                                "\nextern YYSTYPE yylval;\n");
        }
 
       if (semantic_parser)
@@ -1963,7 +1962,7 @@ reader (void)
                  no_parser_flag ? "Bison-generated parse tables" : "A Bison parser",
                  infile, VERSION);
 
-  obstack_grow_literal_string (&table_obstack,
+  obstack_grow_string (&table_obstack,
                       "#define YYBISON 1  /* Identify Bison output.  */\n\n");
   read_declarations ();
   /* Start writing the guard and action files, if they are needed.  */
@@ -1978,7 +1977,7 @@ reader (void)
   /* Write closing delimiters for actions and guards.  */
   output_trailers ();
   if (locations_flag)
-    obstack_grow_literal_string (&table_obstack, "#define YYLSP_NEEDED 1\n\n");
+    obstack_grow_string (&table_obstack, "#define YYLSP_NEEDED 1\n\n");
   /* Assign the symbols their symbol numbers.  Write #defines for the
      token symbols into FDEFINES if requested.  */
   packsymbols ();
@@ -1999,7 +1998,7 @@ void
 reader_output_yylsp (struct obstack *oout)
 {
   if (locations_flag)
-    obstack_grow_literal_string (oout, "\
+    obstack_grow_string (oout, "\
 \n\
 #ifndef YYLTYPE\n\
 typedef struct yyltype\n\
index fbb298bcff7873d50f635f37abafd08197cbab33..8229d484ee5681128d778988565ee77c0cd0561b 100644 (file)
@@ -145,7 +145,7 @@ typedef int bool;
 #define obstack_chunk_free  free
 #include "obstack.h"
 
-#define obstack_grow_literal_string(Obs, Str) \
+#define obstack_grow_string(Obs, Str) \
   obstack_grow (Obs, Str, sizeof (Str) - 1)
 
 #define obstack_fgrow1(Obs, Format, Arg1)      \