]> git.saurik.com Git - bison.git/blobdiff - src/parse-gram.y
* src/parse-gram.y (prologue_declaration): Use MUSCLE_INSERT_STRING
[bison.git] / src / parse-gram.y
index 522540ac905c2d7887186d37265a232f03f96076..5cefbce158c7fa6801563b5100ba5bfb3dfd77d8 100644 (file)
@@ -1,6 +1,7 @@
 %{/* Bison Grammar Parser                             -*- C -*-
 
 %{/* Bison Grammar Parser                             -*- C -*-
 
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation,
+   Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -81,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
 
@@ -132,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"
@@ -143,6 +142,7 @@ static int current_prec = 0;
   PERCENT_FILE_PREFIX     "%file-prefix"
   PERCENT_GLR_PARSER      "%glr-parser"
   PERCENT_INITIAL_ACTION  "%initial-action"
   PERCENT_FILE_PREFIX     "%file-prefix"
   PERCENT_GLR_PARSER      "%glr-parser"
   PERCENT_INITIAL_ACTION  "%initial-action"
+  PERCENT_LANGUAGE        "%language"
   PERCENT_LEX_PARAM       "%lex-param"
   PERCENT_LOCATIONS       "%locations"
   PERCENT_NAME_PREFIX     "%name-prefix"
   PERCENT_LEX_PARAM       "%lex-param"
   PERCENT_LOCATIONS       "%locations"
   PERCENT_NAME_PREFIX     "%name-prefix"
@@ -152,11 +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_PURE_PARSER     "%pure-parser"
   PERCENT_PUSH_PARSER     "%push-parser"
+  PERCENT_PUSH_PULL_PARSER
+                          "%push-pull-parser"
   PERCENT_REQUIRE        "%require"
   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"
@@ -176,19 +176,19 @@ static int current_prec = 0;
 %token SEMICOLON       ";"
 %token TYPE            "type"
 %token TYPE_TAG_ANY    "<*>"
 %token SEMICOLON       ";"
 %token TYPE            "type"
 %token TYPE_TAG_ANY    "<*>"
-%token TYPE_TAG_NONE   "<!>"
+%token TYPE_TAG_NONE   "<>"
 
 %type <character> CHAR
 %printer { fputs (char_name ($$), stderr); } CHAR
 
 /* braceless is not to be used for rule or symbol actions, as it
 
 %type <character> CHAR
 %printer { fputs (char_name ($$), stderr); } CHAR
 
 /* braceless is not to be used for rule or symbol actions, as it
-   calls translate_code. */
-%type <chars> STRING "%{...%}" EPILOGUE braceless content content.opt
+   calls code_props_plain_init.  */
+%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
 %printer { fprintf (stderr, "<%s>", $$); } TYPE
 
 %type <uniqstr> TYPE ID ID_COLON
 %printer { fprintf (stderr, "<%s>", $$); } TYPE
@@ -222,14 +222,41 @@ prologue_declarations:
 
 prologue_declaration:
   grammar_declaration
 
 prologue_declaration:
   grammar_declaration
-| "%{...%}"     { prologue_augment (translate_code ($1, @1), @1, union_seen); }
+| "%{...%}"
+    {
+      code_props plain_code;
+      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);
+      code_scanner_last_string_free ();
+    }
 | "%debug"                         { debug_flag = true; }
 | "%debug"                         { debug_flag = true; }
-| "%define" STRING content.opt     { muscle_insert ($2, $3); }
+| "%define" STRING content.opt
+    {
+      /* FIXME: Special characters in $2 may break %define.
+         For example: `['.  */
+      char const name_prefix[] = "percent_define_";
+      char *name = xmalloc (sizeof name_prefix + strlen ($2));
+      strcpy (name, name_prefix);
+      strcpy (name + sizeof name_prefix - 1, $2);
+      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 ("user_percent_define_variables", $2, @2);
+    }
 | "%defines"                       { defines_flag = true; }
 | "%defines"                       { defines_flag = true; }
+| "%defines" STRING
+    {
+      defines_flag = true;
+      spec_defines_file = xstrdup ($2);
+    }
 | "%error-verbose"                 { error_verbose = true; }
 | "%expect" INT                    { expected_sr_conflicts = $2; }
 | "%expect-rr" INT                { expected_rr_conflicts = $2; }
 | "%error-verbose"                 { error_verbose = true; }
 | "%expect" INT                    { expected_sr_conflicts = $2; }
 | "%expect-rr" INT                { expected_rr_conflicts = $2; }
-| "%file-prefix" "=" STRING        { spec_file_prefix = $3; }
+| "%file-prefix" STRING            { spec_file_prefix = $2; }
+| "%file-prefix" "=" STRING        { spec_file_prefix = $3; } /* deprecated */
 | "%glr-parser"
     {
       nondeterministic_parser = true;
 | "%glr-parser"
     {
       nondeterministic_parser = true;
@@ -237,19 +264,28 @@ prologue_declaration:
     }
 | "%initial-action" "{...}"
     {
     }
 | "%initial-action" "{...}"
     {
-      muscle_code_grow ("initial_action", translate_symbol_action ($2, @2), @2);
+      code_props action;
+      code_props_symbol_action_init (&action, $2, @2);
+      code_props_translate_code (&action);
+      gram_scanner_last_string_free ();
+      muscle_code_grow ("initial_action", action.code, @2);
+      code_scanner_last_string_free ();
     }
     }
+| "%language" STRING           { language_argmatch ($2, 1, &@1); }
 | "%lex-param" "{...}"         { add_param ("lex_param", $2, @2); }
 | "%locations"                  { locations_flag = true; }
 | "%lex-param" "{...}"         { add_param ("lex_param", $2, @2); }
 | "%locations"                  { locations_flag = true; }
-| "%name-prefix" "=" STRING     { spec_name_prefix = $3; }
+| "%name-prefix" STRING         { spec_name_prefix = $2; }
+| "%name-prefix" "=" STRING     { spec_name_prefix = $3; } /* deprecated */
 | "%no-lines"                   { no_lines_flag = true; }
 | "%nondeterministic-parser"   { nondeterministic_parser = true; }
 | "%no-lines"                   { no_lines_flag = true; }
 | "%nondeterministic-parser"   { nondeterministic_parser = true; }
-| "%output" "=" STRING          { spec_outfile = $3; }
+| "%output" STRING              { spec_outfile = $2; }
+| "%output" "=" STRING          { spec_outfile = $3; }  /* deprecated */
 | "%parse-param" "{...}"       { add_param ("parse_param", $2, @2); }
 | "%pure-parser"                { pure_parser = true; }
 | "%parse-param" "{...}"       { add_param ("parse_param", $2, @2); }
 | "%pure-parser"                { pure_parser = true; }
-| "%push-parser"                { push_parser = true; }
+| "%push-parser"                { push_parser = true; pull_parser = false; }
+| "%push-pull-parser"           { push_parser = true; pull_parser = true; }
 | "%require" STRING             { version_check (&@2, $2); }
 | "%require" STRING             { version_check (&@2, $2); }
-| "%skeleton" STRING            { skeleton = $2; }
+| "%skeleton" STRING            { skeleton_arg ($2, 1, &@1); }
 | "%token-table"                { token_table_flag = true; }
 | "%verbose"                    { report_flag = report_states; }
 | "%yacc"                       { yacc_flag = true; }
 | "%token-table"                { token_table_flag = true; }
 | "%verbose"                    { report_flag = report_states; }
 | "%yacc"                       { yacc_flag = true; }
@@ -266,17 +302,15 @@ grammar_declaration:
 | "%destructor" "{...}" generic_symlist
     {
       symbol_list *list;
 | "%destructor" "{...}" generic_symlist
     {
       symbol_list *list;
-      const char *action = translate_symbol_action ($2, @2);
       for (list = $3; list; list = list->next)
       for (list = $3; list; list = list->next)
-       symbol_list_destructor_set (list, action, @2);
+       symbol_list_destructor_set (list, $2, @2);
       symbol_list_free ($3);
     }
 | "%printer" "{...}" generic_symlist
     {
       symbol_list *list;
       symbol_list_free ($3);
     }
 | "%printer" "{...}" generic_symlist
     {
       symbol_list *list;
-      const char *action = translate_symbol_action ($2, @2);
       for (list = $3; list; list = list->next)
       for (list = $3; list; list = list->next)
-       symbol_list_printer_set (list, action, @2);
+       symbol_list_printer_set (list, $2, @2);
       symbol_list_free ($3);
     }
 | "%default-prec"
       symbol_list_free ($3);
     }
 | "%default-prec"
@@ -287,10 +321,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", $2, @2);
+      code_scanner_last_string_free ();
+    }
+| "%code" STRING 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));
+      strcpy (name, name_prefix);
+      strcpy (name + sizeof name_prefix - 1, $2);
+      muscle_code_grow (uniqstr_new (name), $3, @3);
+      free (name);
+      code_scanner_last_string_free ();
+      muscle_grow_user_name_list ("user_percent_code_qualifiers", $2, @2);
+    }
 ;
 
 
 ;
 
 
@@ -327,6 +375,7 @@ grammar_declaration:
 
       union_seen = true;
       muscle_code_grow ("stype", body, @3);
 
       union_seen = true;
       muscle_code_grow ("stype", body, @3);
+      gram_scanner_last_string_free ();
     }
 ;
 
     }
 ;
 
@@ -397,7 +446,7 @@ generic_symlist_item:
   symbol            { $$ = symbol_list_sym_new ($1, @1); }
 | TYPE              { $$ = symbol_list_type_new ($1, @1); }
 | "<*>"             { $$ = symbol_list_default_tagged_new (@1); }
   symbol            { $$ = symbol_list_sym_new ($1, @1); }
 | TYPE              { $$ = symbol_list_type_new ($1, @1); }
 | "<*>"             { $$ = symbol_list_default_tagged_new (@1); }
-| "<!>"             { $$ = symbol_list_default_tagless_new (@1); }
+| "<>"             { $$ = symbol_list_default_tagless_new (@1); }
 ;
 
 /* One token definition.  */
 ;
 
 /* One token definition.  */
@@ -486,14 +535,9 @@ rhs:
 ;
 
 
 ;
 
 
-/*-----------*
- | content.  |
- *-----------*/
-
-content:
-  STRING
-| braceless
-;
+/*---------------*
+ | content.opt.  |
+ *--------------*/
 
 /* Some content or "1" by default. */
 content.opt:
 
 /* Some content or "1" by default. */
 content.opt:
@@ -502,15 +546,23 @@ content.opt:
       static char one[] = "1";
       $$ = one;
     }
       static char one[] = "1";
       $$ = one;
     }
-| content
+| STRING
 ;
 
 
 ;
 
 
+/*-------------*
+ | braceless.  |
+ *-------------*/
+
 braceless:
   "{...}"
     {
 braceless:
   "{...}"
     {
+      code_props plain_code;
       $1[strlen ($1) - 1] = '\n';
       $1[strlen ($1) - 1] = '\n';
-      $$ = translate_code ($1 + 1, @1);
+      code_props_plain_init (&plain_code, $1+1, @1);
+      code_props_translate_code (&plain_code);
+      gram_scanner_last_string_free ();
+      $$ = plain_code.code;
     }
 ;
 
     }
 ;
 
@@ -556,8 +608,12 @@ epilogue.opt:
   /* Nothing.  */
 | "%%" EPILOGUE
     {
   /* Nothing.  */
 | "%%" EPILOGUE
     {
-      muscle_code_grow ("epilogue", translate_code ($2, @2), @2);
+      code_props plain_code;
+      code_props_plain_init (&plain_code, $2, @2);
+      code_props_translate_code (&plain_code);
       gram_scanner_last_string_free ();
       gram_scanner_last_string_free ();
+      muscle_code_grow ("epilogue", plain_code.code, @2);
+      code_scanner_last_string_free ();
     }
 ;
 
     }
 ;