X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/7eb8a0bcca2b3897f4a2045cd36250191d4e6aa0..279cabb657e5116d9fd4badace040f36f579199a:/src/parse-gram.y

diff --git a/src/parse-gram.y b/src/parse-gram.y
index d0ea0569..4d463a91 100644
--- a/src/parse-gram.y
+++ b/src/parse-gram.y
@@ -183,16 +183,16 @@ static int current_prec = 0;
 
 /* braceless is not to be used for rule or symbol actions, as it
    calls code_props_plain_init.  */
-%type <chars> STRING "%{...%}" EPILOGUE braceless content content.opt
+%type <chars> STRING "%{...%}" EPILOGUE braceless content.opt
 %type <code> "{...}"
 %printer { fputs (quotearg_style (c_quoting_style, $$), stderr); }
 	 STRING
 %printer { fprintf (stderr, "{\n%s\n}", $$); }
-	 braceless content content.opt "{...}" "%{...%}" EPILOGUE
+	 braceless content.opt "{...}" "%{...%}" EPILOGUE
 
-%type <uniqstr> TYPE ID ID_COLON
+%type <uniqstr> TYPE ID ID_COLON variable
 %printer { fprintf (stderr, "<%s>", $$); } TYPE
-%printer { fputs ($$, stderr); } ID
+%printer { fputs ($$, stderr); } ID variable
 %printer { fprintf (stderr, "%s:", $$); } ID_COLON
 
 %type <integer> INT
@@ -228,18 +228,24 @@ prologue_declaration:
       code_props_plain_init (&plain_code, $1, @1);
       code_props_translate_code (&plain_code);
       gram_scanner_last_string_free ();
-      prologue_augment (plain_code.code, @1, union_seen);
+      muscle_code_grow (union_seen ? "post_prologue" : "pre_prologue",
+                        plain_code.code, @1);
       code_scanner_last_string_free ();
     }
 | "%debug"                         { debug_flag = true; }
-| "%define" STRING content.opt
+| "%define" variable content.opt
     {
-      /* FIXME: Special characters in $2 may break %define.
-         For example: `['.  */
-      if (muscle_find_const ($2))
-        warn_at (@2, _("%s: `%s' redefined"), "%define", $2);
-      muscle_insert ($2, $3);
-      muscle_grow_used_name_list ("used_percent_define_variables", $2, @2);
+      char const name_prefix[] = "percent_define(";
+      size_t length = strlen ($2);
+      char *name = xmalloc (sizeof name_prefix + length + 1);
+      strcpy (name, name_prefix);
+      strcpy (name + sizeof name_prefix - 1, $2);
+      strcpy (name + sizeof name_prefix - 1 + length, ")");
+      if (muscle_find_const (name))
+        warn_at (@2, _("%s `%s' redefined"), "%define variable", $2);
+      MUSCLE_INSERT_STRING (uniqstr_new (name), $3);
+      free (name);
+      muscle_grow_user_name_list ("percent_define_user_variables", $2, @2);
     }
 | "%defines"                       { defines_flag = true; }
 | "%defines" STRING
@@ -318,21 +324,21 @@ grammar_declaration:
     }
 | "%code" braceless
     {
-      muscle_code_grow ("percent_code", $2, @2);
+      muscle_code_grow ("percent_code_unqualified", $2, @2);
       code_scanner_last_string_free ();
     }
-| "%code" STRING braceless
+| "%code" ID braceless
     {
-      /* FIXME: Special characters in $2 may break %code.
-         For example: `['.  */
-      char const name_prefix[] = "percent_code_";
-      char *name = xmalloc (sizeof name_prefix + strlen ($2));
+      char const name_prefix[] = "percent_code(";
+      size_t length = strlen ($2);
+      char *name = xmalloc (sizeof name_prefix + length + 1);
       strcpy (name, name_prefix);
       strcpy (name + sizeof name_prefix - 1, $2);
+      strcpy (name + sizeof name_prefix - 1 + length, ")");
       muscle_code_grow (uniqstr_new (name), $3, @3);
       free (name);
       code_scanner_last_string_free ();
-      muscle_grow_used_name_list ("used_percent_code_qualifiers", $2, @2);
+      muscle_grow_user_name_list ("percent_code_user_qualifiers", $2, @2);
     }
 ;
 
@@ -349,28 +355,11 @@ union_name:
 ;
 
 grammar_declaration:
-  "%union" union_name "{...}"
+  "%union" union_name braceless
     {
-      char const *body = $3;
-
-      /* Concatenate the %union bodies.  If this is the first %union, make sure
-	 the synchronization line appears after the opening '{' so as not to
-	 confuse Doxygen.  Otherwise, turn the previous %union's trailing '}'
-	 into '\n', and omit the new %union's leading '{'.  */
-      if (!union_seen)
-	{
-	  muscle_grow ("stype", "{", "");
-	}
-      else
-	{
-	  char *code = muscle_find ("stype");
-	  code[strlen (code) - 1] = '\n';
-	}
-      body++;
-
       union_seen = true;
-      muscle_code_grow ("stype", body, @3);
-      gram_scanner_last_string_free ();
+      muscle_code_grow ("stype", $3, @3);
+      code_scanner_last_string_free ();
     }
 ;
 
@@ -530,14 +519,14 @@ rhs:
 ;
 
 
-/*-----------*
- | content.  |
- *-----------*/
+/*----------------------------*
+ | variable and content.opt.  |
+ *---------------------------*/
 
-content:
-  STRING
-| braceless
-;
+variable:
+  ID
+  | STRING { $$ = uniqstr_new ($1); } /* deprecated and not M4-friendly */
+  ;
 
 /* Some content or "1" by default. */
 content.opt:
@@ -546,10 +535,14 @@ content.opt:
       static char one[] = "1";
       $$ = one;
     }
-| content
+| STRING
 ;
 
 
+/*-------------*
+ | braceless.  |
+ *-------------*/
+
 braceless:
   "{...}"
     {
@@ -596,7 +589,9 @@ string_as_id:
   STRING
     {
       $$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
-      symbol_class_set ($$, token_sym, @1, false);
+      symbol_class_set ($$,
+                        current_class == unknown_sym
+                        ? token_sym : current_class, @1, false);
     }
 ;