X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/a06331788509386cd43b8cc1d2891126b372c5de..f57a753663ecb42c6c261a7542e28695b920fb70:/data/push.c diff --git a/data/push.c b/data/push.c index 47962d3c..ee9aa671 100644 --- a/data/push.c +++ b/data/push.c @@ -1,9 +1,9 @@ -m4_divert(-1) -*- C -*- + -*- C -*- # Yacc compatible skeleton for Bison -# Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 -# Free Software Foundation, Inc. +# Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +# 2007 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,6 +20,18 @@ m4_divert(-1) -*- C -*- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA +# Handle BISON_USE_PUSH_FOR_PULL for the test suite. So that push parsing +# tests function as written, don't let BISON_USE_PUSH_FOR_PULL modify Bison's +# behavior at all when push parsing is already requested. +b4_use_push_for_pull_if([ + b4_push_if([ + m4_define([b4_use_push_for_pull_flag], [[0]]) + b4_define_flag_if([use_push_for_pull]) + ], [ + m4_define([b4_push_flag], [[1]]) + b4_define_flag_if([push]) + ])]) + m4_include(b4_pkgdatadir/[c.m4]) ## ---------------- ## @@ -63,7 +75,6 @@ b4_locations_if([, [[YYLTYPE *], [&yylloc]]])m4_ifdef([b4_lex_param], [, ])])dnl m4_ifdef([b4_lex_param], b4_lex_param))) - ## ------------ ## ## Data Types. ## ## ------------ ## @@ -133,8 +144,8 @@ m4_define([b4_rhs_location], # We do want M4 expansion after # for CPP macros. m4_changecom() -m4_divert(0)dnl -@output b4_parser_file_name +m4_divert_push(0)dnl +@output(b4_parser_file_name@) b4_copyright([Skeleton implementation for Bison's Yacc-like parsers in C],dnl ' [1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006])[ @@ -149,20 +160,22 @@ b4_copyright([Skeleton implementation for Bison's Yacc-like parsers in C],dnl ' USER NAME SPACE" below. */ ]b4_identification +b4_percent_code_get([[top]])[]dnl m4_if(b4_prefix, [yy], [], -[/* Substitute the variable and function names. */ -]b4_push_if([#define yypush_parse b4_prefix[]push_parse -#define yypstate_new b4_prefix[]pstate_new -#define yypstate_delete b4_prefix[]pstate_delete -#define yypstate b4_prefix[]pstate], -[#define yyparse b4_prefix[]parse])[ -#define yylex b4_prefix[]lex -#define yyerror b4_prefix[]error -#define yylval b4_prefix[]lval -#define yychar b4_prefix[]char -#define yydebug b4_prefix[]debug -#define yynerrs b4_prefix[]nerrs -b4_locations_if([#define yylloc b4_prefix[]lloc])])[ +[[/* Substitute the variable and function names. */ +]b4_pull_if([[#define yyparse ]b4_prefix[parse +]])b4_push_if([[#define yypush_parse ]b4_prefix[push_parse +]b4_pull_if([[#define yypull_parse ]b4_prefix[pull_parse +]])[#define yypstate_new ]b4_prefix[pstate_new +#define yypstate_delete ]b4_prefix[pstate_delete +#define yypstate ]b4_prefix[pstate +]])[#define yylex ]b4_prefix[lex +#define yyerror ]b4_prefix[error +#define yylval ]b4_prefix[lval +#define yychar ]b4_prefix[char +#define yydebug ]b4_prefix[debug +#define yynerrs ]b4_prefix[nerrs +]b4_locations_if([[#define yylloc ]b4_prefix[lloc]])])[ /* Copy the first part of user declarations. */ ]b4_user_pre_prologue[ @@ -185,17 +198,16 @@ b4_locations_if([#define yylloc b4_prefix[]lloc])])[ # define YYTOKEN_TABLE ]b4_token_table[ #endif -]m4_ifdef([b4_requires], -[[/* Copy the %requires blocks. */ -]b4_user_requires])[]dnl +]b4_percent_code_get([[requires]])[]dnl b4_token_enums_defines(b4_tokens)[ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED ]m4_ifdef([b4_stype], [[typedef union ]b4_union_name[ +{ ]b4_user_stype[ - YYSTYPE; +} YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1]], [m4_if(b4_tag_seen_flag, 0, [[typedef int YYSTYPE; @@ -222,25 +234,29 @@ b4_push_if([[#ifndef YYPUSH_DECLS struct yypstate; typedef struct yypstate yypstate; enum { YYPUSH_MORE = 4 }; -]b4_c_function_decl([[yypstate_new]], [[yypstate *]], [[[void]], []]) -b4_c_function_decl([[yypstate_delete]], [[void]], - [[[yypstate *yyps]], [[yyps]]]) -b4_c_function_decl([[yypush_parse]], [[int]], - [[[yypstate *yyps]], [[yyps]]], + +]b4_pull_if([b4_c_function_decl([[yyparse]], [[int]], b4_parse_param) +])b4_c_function_decl([[yypush_parse]], [[int]], + [[[yypstate *yyps]], [[yyps]]]b4_pure_if([, [[[int yypushed_char]], [[yypushed_char]]], [[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([, - [[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])m4_ifset([b4_parse_param], [, - b4_parse_param]))[ + [[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])])m4_ifset([b4_parse_param], [, + b4_parse_param])) +b4_pull_if([b4_c_function_decl([[yypull_parse]], [[int]], + [[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [, + b4_parse_param]))]) +b4_c_function_decl([[yypstate_new]], [[yypstate *]], [[[void]], []]) +b4_c_function_decl([[yypstate_delete]], [[void]], + [[[yypstate *yyps]], [[yyps]]])[ #endif ]]) -m4_ifdef([b4_provides], -[[/* Copy the %provides blocks. */ -]b4_user_provides])[]dnl +b4_percent_code_get([[provides]])[]dnl [/* Copy the second part of user declarations. */ -]b4_user_post_prologue[ +]b4_user_post_prologue +b4_percent_code_get[]dnl -#ifdef short +[#ifdef short # undef short #endif @@ -316,7 +332,8 @@ typedef short int yytype_int16; #if ! defined yyoverflow || YYERROR_VERBOSE -/* The parser invokes alloca or malloc; define the necessary symbols. */ +]b4_push_if([], +[[/* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA @@ -341,7 +358,8 @@ typedef short int yytype_int16; # endif # endif -# ifdef YYSTACK_ALLOC +]])dnl +[# ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM @@ -732,12 +750,12 @@ do { \ /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { - fprintf (stderr, " $%d = ", yyi + 1); + YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &]b4_rhs_value(yynrhs, yyi + 1)[ ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl b4_user_args[); - fprintf (stderr, "\n"); + YYFPRINTF (stderr, "\n"); } } @@ -1011,12 +1029,8 @@ m4_define([b4_declare_parser_state_variables], int yynerrs; ]])[ int yystate; - int yyn; - int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; - /* Look-ahead token as an internal (translated) token number. */ - int yytoken; /* Three stacks and their tools: `yyss': related to states, @@ -1045,12 +1059,7 @@ m4_define([b4_declare_parser_state_variables], YYLTYPE yyerror_range[2]; ]])[ YYSIZE_T yystacksize; - - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; -]b4_locations_if([[ YYLTYPE yyloc; -]])]) +]]) m4_divert_pop([KILL])dnl# ====================== End of M4 code. @@ -1065,11 +1074,49 @@ b4_push_if( int yynew; }; +]b4_pull_if([b4_c_function_def([[yyparse]], [[int]], b4_parse_param)[ +{ + return yypull_parse (0]m4_ifset([b4_parse_param], + [[, ]b4_c_args(b4_parse_param)])[); +} + +]b4_c_function_def([[yypull_parse]], [[int]], + [[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [, + b4_parse_param]))[ +{ + int yystatus; + yypstate *yyps_local; +]b4_pure_if([[ int yychar; + YYSTYPE yylval; +]b4_locations_if([[ YYLTYPE yylloc; +]])])[ + if (yyps == 0) + { + yyps_local = yypstate_new (); + if (!yyps_local) + { + yyerror (]b4_yyerror_args[YY_("memory exhausted")); + return 2; + } + } + else + yyps_local = yyps; + do { + yychar = YYLEX; + yystatus = + yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])[); + } while (yystatus == YYPUSH_MORE); + if (yyps == 0) + yypstate_delete (yyps_local); + return yystatus; +} +]])[ /* Initialize the parser data structure. */ ]b4_c_function_def([[yypstate_new]], [[yypstate *]])[ { yypstate *yyps = (yypstate *) malloc (sizeof *yyps); - yyps->yyresult = -1; + if (!yyps) + return 0; yyps->yynew = 1; return yyps; } @@ -1082,10 +1129,7 @@ b4_push_if( ]b4_pure_if([[#define ]b4_prefix[nerrs yyps->]b4_prefix[nerrs ]])[#define yystate yyps->yystate -#define yyn yyps->yyn -#define yyresult yyps->yyresult #define yyerrstatus yyps->yyerrstatus -#define yytoken yyps->yytoken #define yyssa yyps->yyssa #define yyss yyps->yyss #define yyssp yyps->yyssp @@ -1097,19 +1141,18 @@ b4_push_if( #define yylsp yyps->yylsp #define yyerror_range yyps->yyerror_range ]])[#define yystacksize yyps->yystacksize -#define yyval yyps->yyval -]b4_locations_if([[#define yyloc yyps->yyloc -]])])[ +]])[ /*-------------------------. | yyparse or yypush_parse. | `-------------------------*/ ]b4_push_if([ -b4_c_function_def([[yypush_parse]], [[int]], [[[yypstate *yyps]], [[yyps]]], +b4_c_function_def([[yypush_parse]], [[int]], + [[[yypstate *yyps]], [[yyps]]]b4_pure_if([, [[[int yypushed_char]], [[yypushed_char]]], [[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([, - [[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])m4_ifset([b4_parse_param], [, + [[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])])m4_ifset([b4_parse_param], [, b4_parse_param]))], [ #ifdef YYPARSE_PARAM b4_c_function_def([yyparse], [int], [[void *YYPARSE_PARAM], [YYPARSE_PARAM]]) @@ -1117,9 +1160,21 @@ b4_c_function_def([yyparse], [int], [[void *YYPARSE_PARAM], [YYPARSE_PARAM]]) b4_c_function_def([yyparse], [int], b4_parse_param) #endif])[ { - ]b4_pure_if([b4_declare_scanner_communication_variables]) - b4_push_if([], [b4_declare_parser_state_variables])[ - +]b4_pure_if([b4_declare_scanner_communication_variables]) +b4_push_if([b4_pure_if([], [[ int yypushed_char = yychar; + YYSTYPE yypushed_val = yylval; + ]b4_locations_if([[YYLTYPE yypushed_loc = yylloc; +]])])], + [b4_declare_parser_state_variables])[ + int yyn; + int yyresult; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; +]b4_locations_if([[ YYLTYPE yyloc; +]])[ #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; @@ -1134,7 +1189,10 @@ b4_c_function_def([yyparse], [int], b4_parse_param) int yylen = 0; ]b4_push_if([[ if (!yyps->yynew) - goto yyread_pushed_token; + { + yyn = yypact[yystate]; + goto yyread_pushed_token; + } ]])[ yytoken = 0; yyss = yyssa; @@ -1281,19 +1339,28 @@ yybackup: { ]b4_push_if([[ if (!yyps->yynew) { - YYDPRINTF ((stderr, "Return for a new token:\n")); - yyresult = YYPUSH_MORE; +]b4_use_push_for_pull_if([], +[[ YYDPRINTF ((stderr, "Return for a new token:\n")); +]])[ yyresult = YYPUSH_MORE; goto yypushreturn; } yyps->yynew = 0; - +]b4_pure_if([], [[ + /* Restoring the pushed token is only necessary for the first + yypush_parse invocation since subsequent invocations don't overwrite + it before jumping to yyread_pushed_token. */ + yychar = yypushed_char; + yylval = yypushed_val; + ]b4_locations_if([[yylloc = yypushed_loc; +]])])[ yyread_pushed_token: ]])[ YYDPRINTF ((stderr, "Reading a token: ")); -]b4_push_if([[ yychar = yypushed_char; +]b4_push_if([b4_pure_if([[ yychar = yypushed_char; if (yypushed_val) yylval = *yypushed_val; ]b4_locations_if([[ if (yypushed_loc) - yylloc = *yypushed_loc;]])], + yylloc = *yypushed_loc; +]])])], [[ yychar = YYLEX; ]])[ } @@ -1580,32 +1647,34 @@ yyreturn: if (yyss != yyssa) YYSTACK_FREE (yyss); #endif -]b4_push_if([yypushreturn:])[ -#if YYERROR_VERBOSE +]b4_push_if([[ yyps->yynew = 1; + +yypushreturn: +]])[#if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); -]} +} + -b4_epilogue +]b4_epilogue b4_defines_if( -[@output b4_spec_defines_file +[@output(b4_spec_defines_file@) b4_copyright([Skeleton interface for Bison's Yacc-like parsers in C],dnl ' [1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006]) -m4_ifdef([b4_requires], -[[/* Copy the %requires blocks. */ -]b4_user_requires])[]dnl +b4_percent_code_get([[requires]])[]dnl b4_token_enums_defines(b4_tokens) [#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED ]m4_ifdef([b4_stype], [[typedef union ]b4_union_name[ +{ ]b4_user_stype[ - YYSTYPE; +} YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1]], [m4_if(b4_tag_seen_flag, 0, [[typedef int YYSTYPE; @@ -1638,19 +1707,22 @@ b4_push_if([[#ifndef YYPUSH_DECLS struct ]b4_prefix[pstate; typedef struct ]b4_prefix[pstate ]b4_prefix[pstate; enum { YYPUSH_MORE = 4 }; -]b4_c_function_decl([b4_prefix[pstate_new]], [b4_prefix[pstate *]], - [[[void]], []]) -b4_c_function_decl([b4_prefix[pstate_delete]], [[void]], - [[b4_prefix[pstate *yyps]], [[yyps]]]) -b4_c_function_decl([b4_prefix[push_parse]], [[int]], - [[b4_prefix[pstate *yyps]], [[yyps]]], +]b4_pull_if([b4_c_function_decl([b4_prefix[parse]], [[int]], b4_parse_param) +])b4_c_function_decl([b4_prefix[push_parse]], [[int]], + [[b4_prefix[pstate *yyps]], [[yyps]]]b4_pure_if([, [[[int yypushed_char]], [[yypushed_char]]], [[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([, - [[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])m4_ifset([b4_parse_param], [, - b4_parse_param]))[ + [[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])])m4_ifset([b4_parse_param], [, + b4_parse_param])) +b4_pull_if([b4_c_function_decl([b4_prefix[pull_parse]], [[int]], + [[b4_prefix[pstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [, + b4_parse_param]))]) +b4_c_function_decl([b4_prefix[pstate_new]], [b4_prefix[pstate *]], + [[[void]], []]) +b4_c_function_decl([b4_prefix[pstate_delete]], [[void]], + [[b4_prefix[pstate *yyps]], [[yyps]]])[ #endif ]]) -m4_ifdef([b4_provides], -[[/* Copy the %provides blocks. */ -]b4_user_provides])[] +b4_percent_code_get([[provides]])[]dnl ])dnl b4_defines_if +m4_divert_pop(0)