]> git.saurik.com Git - bison.git/blobdiff - src/parse-gram.y
* NEWS, data/c++-skel.m4, data/c++.m4, data/c-skel.m4, data/c.m4,
[bison.git] / src / parse-gram.y
index d0ea0569b4f6b090dd225664a1aed105c7514d0b..4d463a9160876c80ec004e66d43980bea89befdf 100644 (file)
@@ -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);
     }
 ;