]> git.saurik.com Git - bison.git/blobdiff - src/parse-gram.y
Update etc/bench.pl. Optimize push mode a little (the yyn change
[bison.git] / src / parse-gram.y
index 33a5c37e67170979d3f45cfc4430e3e40fcdae1b..ba0ef6f936801768919467b98309bc7efaf8b605 100644 (file)
@@ -143,6 +143,7 @@ static int current_prec = 0;
   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"
@@ -176,13 +177,13 @@ static int current_prec = 0;
 %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
-   calls code_props_plain_init. */
+   calls translate_code. */
 %type <chars> STRING "%{...%}" EPILOGUE braceless content content.opt
 %type <code> "{...}"
 %printer { fputs (quotearg_style (c_quoting_style, $$), stderr); }
@@ -222,21 +223,20 @@ prologue_declarations:
 
 prologue_declaration:
   grammar_declaration
-| "%{...%}" {
-   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 (code_props_code_get (plain_code), @1, union_seen);
-   code_scanner_last_string_free ();
-}
+| "%{...%}"     { prologue_augment (translate_code ($1, @1), @1, union_seen); }
 | "%debug"                         { debug_flag = true; }
 | "%define" STRING content.opt     { muscle_insert ($2, $3); }
 | "%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; }
-| "%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;
@@ -244,24 +244,22 @@ prologue_declaration:
     }
 | "%initial-action" "{...}"
     {
-      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", code_props_code_get (action), @2);
-      code_scanner_last_string_free ();
+      muscle_code_grow ("initial_action", translate_symbol_action ($2, @2), @2);
     }
+| "%language" STRING           { language_argmatch ($2, 1, &@1); }
 | "%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; }
-| "%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; }
 | "%push-parser"                { push_parser = true; }
 | "%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; }
@@ -278,15 +276,17 @@ grammar_declaration:
 | "%destructor" "{...}" generic_symlist
     {
       symbol_list *list;
+      const char *action = translate_symbol_action ($2, @2);
       for (list = $3; list; list = list->next)
-       symbol_list_destructor_set (list, $2, @2);
+       symbol_list_destructor_set (list, action, @2);
       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)
-       symbol_list_printer_set (list, $2, @2);
+       symbol_list_printer_set (list, action, @2);
       symbol_list_free ($3);
     }
 | "%default-prec"
@@ -337,7 +337,6 @@ grammar_declaration:
 
       union_seen = true;
       muscle_code_grow ("stype", body, @3);
-      gram_scanner_last_string_free ();
     }
 ;
 
@@ -408,7 +407,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_list_default_tagless_new (@1); }
+| "<>"             { $$ = symbol_list_default_tagless_new (@1); }
 ;
 
 /* One token definition.  */
@@ -520,12 +519,8 @@ content.opt:
 braceless:
   "{...}"
     {
-      code_props plain_code;
       $1[strlen ($1) - 1] = '\n';
-      code_props_plain_init (&plain_code, $1+1, @1);
-      code_props_translate_code (&plain_code);
-      gram_scanner_last_string_free ();
-      $$ = code_props_code_get (plain_code);
+      $$ = translate_code ($1 + 1, @1);
     }
 ;
 
@@ -571,12 +566,8 @@ epilogue.opt:
   /* Nothing.  */
 | "%%" EPILOGUE
     {
-      code_props plain_code;
-      code_props_plain_init (&plain_code, $2, @2);
-      code_props_translate_code (&plain_code);
+      muscle_code_grow ("epilogue", translate_code ($2, @2), @2);
       gram_scanner_last_string_free ();
-      muscle_code_grow ("epilogue", code_props_code_get (plain_code), @2);
-      code_scanner_last_string_free ();
     }
 ;