]> git.saurik.com Git - bison.git/commitdiff
* src/scan-gram.l, src/reader.h (scanner_last_string_free):
authorAkim Demaille <akim@epita.fr>
Tue, 12 Nov 2002 08:26:38 +0000 (08:26 +0000)
committerAkim Demaille <akim@epita.fr>
Tue, 12 Nov 2002 08:26:38 +0000 (08:26 +0000)
Restore.
* src/scan-gram.l (last_string): Is global to the file, not to
yylex.
* src/parse-gram.y (input): Don't append the epilogue here,
(epilogue.opt): do it here, and free the scanner's obstack.
* src/reader.c (epilogue_set): Rename as...
(epilogue_augment): this.
* data/c.m4 (b4_epilogue): Defaults to empty.

ChangeLog
data/c.m4
src/parse-gram.c
src/parse-gram.y
src/reader.c
src/reader.h
src/scan-gram.l

index a715cc9666bf14dda21dd88e3de9305db0a7ddf3..112d663e9c3c7647532f082805e4921de372c34b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2002-11-12  Akim Demaille  <akim@epita.fr>
+
+       * src/scan-gram.l, src/reader.h (scanner_last_string_free):
+       Restore.
+       * src/scan-gram.l (last_string): Is global to the file, not to
+       yylex.
+       * src/parse-gram.y (input): Don't append the epilogue here,
+       (epilogue.opt): do it here, and free the scanner's obstack.
+       * src/reader.c (epilogue_set): Rename as...
+       (epilogue_augment): this.
+       * data/c.m4 (b4_epilogue): Defaults to empty.
+
 2002-11-12  Akim Demaille  <akim@epita.fr>
 
        * src/getargs.c (long_options): Remove duplicates.
index aad71bac9b56ba90d27b3fa819488975a3ecb419..b67a44384c12fca19e62cf1c5ea1cda4df30eb6d 100644 (file)
--- a/data/c.m4
+++ b/data/c.m4
@@ -65,6 +65,14 @@ m4_define([b4_identification],
 
 
 
+## ---------------- ##
+## Default values.  ##
+## ---------------- ##
+
+m4_define_default([b4_epilogue], [])
+
+
+
 ## ------------------------ ##
 ## Pure/impure interfaces.  ##
 ## ------------------------ ##
index 5d2706cc42e867828db98d4b4dc05387be0a6edb..841054cf03cb7d48328719d17595cb6204e4b15a 100644 (file)
@@ -458,14 +458,14 @@ static const yysigned_char yyrhs[] =
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short yyrline[] =
 {
-       0,   169,   169,   182,   184,   187,   189,   190,   191,   192,
+       0,   170,   170,   182,   184,   187,   189,   190,   191,   192,
      193,   194,   195,   196,   197,   199,   200,   201,   202,   203,
      205,   206,   207,   208,   209,   212,   214,   215,   219,   226,
      225,   236,   235,   248,   247,   253,   253,   258,   267,   282,
      284,   285,   288,   290,   295,   297,   301,   306,   311,   317,
      323,   333,   336,   345,   347,   353,   355,   360,   367,   366,
      371,   373,   376,   379,   381,   383,   385,   387,   391,   393,
-     396,   402,   411,   419,   424,   430,   432
+     396,   402,   411,   419,   421,   428,   430
 };
 #endif
 
@@ -1216,10 +1216,9 @@ yyreduce:
   switch (yyn)
     {
         case 2:
-#line 171 "parse-gram.y"
+#line 172 "parse-gram.y"
     {
       yycontrol->errcode = 0;
-      epilogue_set (yyvsp[0].string, yylsp[0]);
     }
     break;
 
@@ -1601,17 +1600,11 @@ yyreduce:
     }
     break;
 
-  case 73:
-#line 421 "parse-gram.y"
-    {
-      yyval.string = xstrdup ("");
-    }
-    break;
-
   case 74:
-#line 425 "parse-gram.y"
+#line 422 "parse-gram.y"
     {
-      yyval.string = yyvsp[0].string;
+      epilogue_augment (yyvsp[0].string, yylsp[0]);
+      scanner_last_string_free ();
     }
     break;
 
@@ -1619,7 +1612,7 @@ yyreduce:
     }
 
 /* Line 1056 of /usr/local/share/bison/yacc.c.  */
-#line 1623 "parse-gram.c"
+#line 1616 "parse-gram.c"
 \f
   yyvsp -= yylen;
   yyssp -= yylen;
@@ -1838,7 +1831,7 @@ yyreturn:
 }
 
 
-#line 434 "parse-gram.y"
+#line 432 "parse-gram.y"
 
 /*------------------------------------------------------------------.
 | When debugging the parser, display tokens' locations and values.  |
@@ -1872,6 +1865,10 @@ yyprint (FILE *file,
     case EPILOGUE:
       fprintf (file, " = {{ %s }}", value->string);
       break;
+
+    default:
+      fprintf (file, "unknown token type");
+      break;
     }
 }
 
index 74a6574fe2aedfa098c5d2c72727be784f0e301b..c10c82ac61043ecfe68f0c6ae0b37f438867c2bb 100644 (file)
@@ -158,7 +158,8 @@ braced_code_t current_braced_code = action_braced_code;
 
 
 %type <string> STRING string_content
-               BRACED_CODE PROLOGUE EPILOGUE epilogue.opt action
+               BRACED_CODE action
+               PROLOGUE EPILOGUE
 %type <struniq> TYPE
 %type <integer> INT
 %type <symbol> ID symbol string_as_id
@@ -170,7 +171,6 @@ input:
   declarations "%%" grammar epilogue.opt
     {
       yycontrol->errcode = 0;
-      epilogue_set ($4, @4);
     }
 ;
 
@@ -418,12 +418,10 @@ string_content:
 
 epilogue.opt:
   /* Nothing.  */
-    {
-      $$ = xstrdup ("");
-    }
 | "%%" EPILOGUE
     {
-      $$ = $2;
+      epilogue_augment ($2, @2);
+      scanner_last_string_free ();
     }
 ;
 
@@ -464,6 +462,10 @@ yyprint (FILE *file,
     case EPILOGUE:
       fprintf (file, " = {{ %s }}", value->string);
       break;
+
+    default:
+      fprintf (file, "unknown token type");
+      break;
     }
 }
 
index fa34809889bff34bd831c0cf99dd7ab966151ced..9f83a935b9183c77a3e6815cae2410da155d5ff7 100644 (file)
@@ -84,8 +84,9 @@ prologue_augment (const char *prologue, location_t location)
 `----------------------*/
 
 void
-epilogue_set (const char *epilogue, location_t location)
+epilogue_augment (const char *epilogue, location_t location)
 {
+  char *extension = NULL;
   obstack_fgrow1 (&muscle_obstack, "]b4_syncline([[%d]], [[",
                  location.first_line);
   MUSCLE_OBSTACK_SGROW (&muscle_obstack,
@@ -93,7 +94,9 @@ epilogue_set (const char *epilogue, location_t location)
   obstack_sgrow (&muscle_obstack, "]])[\n");
   obstack_sgrow (&muscle_obstack, epilogue);
   obstack_1grow (&muscle_obstack, 0);
-  muscle_insert ("epilogue", obstack_finish (&muscle_obstack));
+  extension = obstack_finish (&muscle_obstack);
+  muscle_grow ("epilogue", extension, "");
+  obstack_free (&muscle_obstack, extension);
 }
 
 
index cca624acfc2fa89918f39d218a6c5a3511da40c9..a32e84f55aa9400fb96890d65fb38ec3bf61af7c 100644 (file)
@@ -42,6 +42,7 @@ extern FILE *gram_in;
 extern int gram__flex_debug;
 void scanner_initialize (void);
 void scanner_free (void);
+void scanner_last_string_free (void);
 
 # define YY_DECL \
   int gram_lex (yystype *yylval, location_t *yylloc, \
@@ -69,7 +70,7 @@ extern braced_code_t current_braced_code;
 /* From reader.c. */
 void grammar_start_symbol_set (symbol_t *s, location_t l);
 void prologue_augment (const char *prologue, location_t location);
-void epilogue_set (const char *epilogue, location_t location);
+void epilogue_augment (const char *epilogue, location_t location);
 void grammar_symbol_append (symbol_t *s, location_t l);
 void grammar_rule_begin (symbol_t *lhs, location_t l);
 void grammar_rule_end (location_t l);
index 02f5e85db74ae3d3093eddfd346134d3f11bdd3e..4e2e194254d5f186559141c8e7e23947f1a5680e 100644 (file)
@@ -142,6 +142,10 @@ extend_location (location_t *loc, char const *token, int size)
 
 static struct obstack string_obstack;
 
+/* A string representing the most recently saved token.  */
+static char *last_string;
+
+
 #define YY_OBS_GROW   \
   obstack_grow (&string_obstack, yytext, yyleng)
 
@@ -154,6 +158,11 @@ static struct obstack string_obstack;
 #define YY_OBS_FREE \
   obstack_free (&string_obstack, last_string)
 
+void
+scanner_last_string_free (void)
+{
+  YY_OBS_FREE;
+}
 
 /* Within well-formed rules, RULE_LENGTH is the number of values in
    the current rule so far, which says where to find `$0' with respect
@@ -199,9 +208,6 @@ splice       (\\[ \f\t\v]*\n)*
   /* Scanner context when scanning C code.  */
   int c_context IF_LINT (= 0);
 
-  /* A string representing the most recently saved token.  */
-  char *last_string;
-
   /* At each yylex invocation, mark the current position as the
      start of the next token.  */
   YY_STEP;