]> 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 dcef7c2d114031dd428133b09778f49244abede9..4d463a9160876c80ec004e66d43980bea89befdf 100644 (file)
@@ -82,7 +82,6 @@ static int current_prec = 0;
 %locations
 %pure-parser
 %error-verbose
 %locations
 %pure-parser
 %error-verbose
-%defines
 %name-prefix="gram_"
 %expect 0
 
 %name-prefix="gram_"
 %expect 0
 
@@ -133,7 +132,6 @@ static int current_prec = 0;
 
 %token
   PERCENT_CODE            "%code"
 
 %token
   PERCENT_CODE            "%code"
-  PERCENT_CODE_TOP        "%code-top"
   PERCENT_DEBUG           "%debug"
   PERCENT_DEFAULT_PREC    "%default-prec"
   PERCENT_DEFINE          "%define"
   PERCENT_DEBUG           "%debug"
   PERCENT_DEFAULT_PREC    "%default-prec"
   PERCENT_DEFINE          "%define"
@@ -154,13 +152,11 @@ static int current_prec = 0;
                          "%nondeterministic-parser"
   PERCENT_OUTPUT          "%output"
   PERCENT_PARSE_PARAM     "%parse-param"
                          "%nondeterministic-parser"
   PERCENT_OUTPUT          "%output"
   PERCENT_PARSE_PARAM     "%parse-param"
-  PERCENT_PROVIDES        "%provides"
   PERCENT_PURE_PARSER     "%pure-parser"
   PERCENT_PUSH_PARSER     "%push-parser"
   PERCENT_PUSH_PULL_PARSER
                           "%push-pull-parser"
   PERCENT_REQUIRE        "%require"
   PERCENT_PURE_PARSER     "%pure-parser"
   PERCENT_PUSH_PARSER     "%push-parser"
   PERCENT_PUSH_PULL_PARSER
                           "%push-pull-parser"
   PERCENT_REQUIRE        "%require"
-  PERCENT_REQUIRES        "%requires"
   PERCENT_SKELETON        "%skeleton"
   PERCENT_START           "%start"
   PERCENT_TOKEN_TABLE     "%token-table"
   PERCENT_SKELETON        "%skeleton"
   PERCENT_START           "%start"
   PERCENT_TOKEN_TABLE     "%token-table"
@@ -187,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.  */
 
 /* 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}", $$); }
 %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 { fprintf (stderr, "<%s>", $$); } TYPE
-%printer { fputs ($$, stderr); } ID
+%printer { fputs ($$, stderr); } ID variable
 %printer { fprintf (stderr, "%s:", $$); } ID_COLON
 
 %type <integer> INT
 %printer { fprintf (stderr, "%s:", $$); } ID_COLON
 
 %type <integer> INT
@@ -232,11 +228,25 @@ prologue_declaration:
       code_props_plain_init (&plain_code, $1, @1);
       code_props_translate_code (&plain_code);
       gram_scanner_last_string_free ();
       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; }
       code_scanner_last_string_free ();
     }
 | "%debug"                         { debug_flag = true; }
-| "%define" STRING content.opt     { muscle_insert ($2, $3); }
+| "%define" variable content.opt
+    {
+      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
     {
 | "%defines"                       { defines_flag = true; }
 | "%defines" STRING
     {
@@ -312,10 +322,24 @@ grammar_declaration:
     {
       default_prec = false;
     }
     {
       default_prec = false;
     }
-| "%code" braceless      { prologue_augment ($2, @2, true); }
-| "%code-top" braceless  { prologue_augment ($2, @2, false); }
-| "%provides" braceless  { muscle_code_grow ("provides", $2, @2); }
-| "%requires" braceless  { muscle_code_grow ("requires", $2, @2); }
+| "%code" braceless
+    {
+      muscle_code_grow ("percent_code_unqualified", $2, @2);
+      code_scanner_last_string_free ();
+    }
+| "%code" ID braceless
+    {
+      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_user_name_list ("percent_code_user_qualifiers", $2, @2);
+    }
 ;
 
 
 ;
 
 
@@ -331,28 +355,11 @@ union_name:
 ;
 
 grammar_declaration:
 ;
 
 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;
       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 ();
     }
 ;
 
     }
 ;
 
@@ -512,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:
 
 /* Some content or "1" by default. */
 content.opt:
@@ -528,10 +535,14 @@ content.opt:
       static char one[] = "1";
       $$ = one;
     }
       static char one[] = "1";
       $$ = one;
     }
-| content
+| STRING
 ;
 
 
 ;
 
 
+/*-------------*
+ | braceless.  |
+ *-------------*/
+
 braceless:
   "{...}"
     {
 braceless:
   "{...}"
     {
@@ -578,7 +589,9 @@ string_as_id:
   STRING
     {
       $$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
   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);
     }
 ;
 
     }
 ;