X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/ee16363fd28099fc295b269da98c2aace6a63395..1d2d7eddf73d4244900ea00fe1949c56db07a2f7:/data/glr.c diff --git a/data/glr.c b/data/glr.c index b775d842..d04edbd0 100644 --- a/data/glr.c +++ b/data/glr.c @@ -1,8 +1,7 @@ m4_divert(-1) -*- C -*- -m4_include([c.m4]) # GLR skeleton for Bison -# Copyright (C) 2002 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003 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 @@ -28,9 +27,6 @@ m4_include([c.m4]) m4_define_default([b4_stack_depth_max], [10000]) m4_define_default([b4_stack_depth_init], [200]) -# Location type. -m4_define_default([b4_location_type], [yyltype]) - ## ------------------------ ## @@ -115,7 +111,7 @@ m4_define([b4_lhs_value], # Expansion of $NUM, where the current rule has RULE-LENGTH # symbols on RHS. m4_define([b4_rhs_value], -[yyvsp@{m4_eval([$2 - $1])@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3])]) +[yyvsp@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3])]) @@ -135,18 +131,16 @@ m4_define([b4_lhs_location], # Expansion of @NUM, where the current rule has RULE-LENGTH symbols # on RHS. m4_define([b4_rhs_location], -[yyvsp@{m4_eval([$2 - $1])@}.yystate.yyloc]) - +[yyvsp@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yyloc]) # We do want M4 expansion after # for CPP macros. m4_changecom() m4_divert(0)dnl @output @output_parser_name@ -b4_copyright([Skeleton parser for GLR parsing with Bison], [2002]) +b4_copyright([Skeleton parser for GLR parsing with Bison], [2002, 2003]) [ /* This is the parser code for GLR (Generalized LR) parser. */ -#include #include #include #include @@ -184,31 +178,31 @@ b4_pre_prologue[ # define YYERROR_VERBOSE ]b4_error_verbose[ #endif -#ifndef YYSTYPE +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) ]m4_ifdef([b4_stype], [b4_syncline([b4_stype_line], [b4_filename]) -typedef union b4_stype yystype; -/* Line __line__ of __file__. */ +typedef union m4_bregexp(b4_stype, [^{], [YYSTYPE ])b4_stype YYSTYPE; +/* Line __line__ of glr.c. */ b4_syncline([@oline@], [@ofile@])], -[typedef int yystype;])[ -# define YYSTYPE yystype +[typedef int YYSTYPE;])[ +# define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif -#ifndef YYLTYPE -typedef struct yyltype +#if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED) +typedef struct YYLTYPE { int first_line; int first_column; int last_line; int last_column; -} yyltype; -# define YYLTYPE ]b4_location_type[ +} YYLTYPE; +# define YYLTYPE_IS_DECLARED 1 # define YYLTYPE_IS_TRIVIAL 1 #endif /* Default (constant) values used for initialization for null - right-hand sides. Unlike the standard bison.simple template, + right-hand sides. Unlike the standard yacc.c template, here we set the default values of $$ and $@@ to zeroed-out values. Since the default value of these quantities is undefined, this behavior is technically correct. */ @@ -218,14 +212,16 @@ static YYLTYPE yyloc_default; /* Copy the second part of user declarations. */ ]b4_post_prologue[ -]/* Line __line__ of __file__. */ +]/* Line __line__ of glr.c. */ b4_syncline([@oline@], [@ofile@]) [ -#if ! defined (__cplusplus) - typedef char bool; -# define yytrue 1 -# define yyfalse 0 +#ifdef __cplusplus + typedef bool yybool; +#else + typedef unsigned char yybool; #endif +#define yytrue 1 +#define yyfalse 0 /*-----------------. | GCC extensions. | @@ -301,8 +297,6 @@ static const char *const yytname[] = { ]b4_tname[ }; - -#define yytname_size ((int) (sizeof (yytname) / sizeof (yytname[0]))) #endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ @@ -514,8 +508,9 @@ int yydebug; properly redirected to new data. */ #define YYHEADROOM 2 -#if ! defined (YYSTACKEXPANDABLE) \ - && (! defined (__cplusplus) || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)) +#if (! defined (YYSTACKEXPANDABLE) \ + && (! defined (__cplusplus) \ + || (]b4_location_if([YYLTYPE_IS_TRIVIAL && ])[YYSTYPE_IS_TRIVIAL))) #define YYSTACKEXPANDABLE 1 #else #define YYSTACKEXPANDABLE 0 @@ -540,8 +535,8 @@ typedef struct yyGLRStack yyGLRStack; typedef struct yyGLRStateSet yyGLRStateSet; struct yyGLRState { - bool yyisState; - bool yyresolved; + yybool yyisState; + yybool yyresolved; yyStateNum yylrState; yyGLRState* yypred; size_t yyposn; @@ -558,7 +553,7 @@ struct yyGLRStateSet { }; struct yySemanticOption { - bool yyisState; + yybool yyisState; yyRuleNum yyrule; yyGLRState* yystate; yySemanticOption* yynext; @@ -616,6 +611,28 @@ yytokenName (yySymbol yytoken) } #endif +/** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting + * at YYVSP[YYLOW0].yystate.yypred. Leaves YYVSP[YYLOW1].yystate.yypred + * containing the pointer to the next state in the chain. Assumes + * YYLOW1 < YYLOW0. For convenience, returns YYLOW1. */ +static int +yyfill (yyGLRStackItem* yyvsp, int yylow0, int yylow1) +{ + yyGLRState* s; + int i; + s = yyvsp[yylow0].yystate.yypred; + for (i = yylow0-1; i >= yylow1; i -= 1) + { + if (! s->yyresolved) + abort (); + yyvsp[i].yystate.yyresolved = yytrue; + yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval; + yyvsp[i].yystate.yyloc = s->yyloc; + s = yyvsp[i].yystate.yypred = s->yypred; + } + return yylow1; +} + /** Perform user action for rule number YYN, with RHS length YYRHSLEN, * and top stack item YYVSP. YYLVALP points to place to put semantic * value ($$), and yylocp points to place for location information @@ -626,8 +643,8 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, YYSTYPE* yyvalp, YYLTYPE* yylocp, yyGLRStack* yystack ]b4_user_formals[) { - /* Avoid `unused' warnings in there are no $n. */ - (void) yystack; + int yynormal = (yystack->yysplitPoint == NULL); + int yylow; if (yyrhslen == 0) { @@ -651,6 +668,9 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, # define YYRECOVERING (yystack->yyerrState != 0) # undef yyclearin # define yyclearin (yychar = *(yystack->yytokenp) = YYEMPTY) +# undef YYFILL +# define YYFILL(N) \ + ((yynormal || yylow <= (N)) ? (N) : (yylow = yyfill (yyvsp, yylow, N))) # undef YYBACKUP # define YYBACKUP(Token, Value) \ do { \ @@ -659,6 +679,7 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, } while (0) ] + yylow = 1; switch (yyn) { b4_actions @@ -672,7 +693,7 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, # undef YYBACKUP # undef yyclearin # undef YYRECOVERING -/* Line __line__ of __file__. */ +/* Line __line__ of glr.c. */ b4_syncline([@oline@], [@ofile@]) } @@ -717,7 +738,7 @@ yylhsNonterm (yyRuleNum yyrule) /** True iff LR state STATE has only a default reduction (regardless * of token). */ -static inline bool +static inline yybool yyisDefaultedState (yyStateNum yystate) { return yyis_pact_ninf (yypact[yystate]); @@ -730,10 +751,10 @@ yydefaultAction (yyStateNum yystate) return yydefact[yystate]; } -#define yyis_table_ninf(yyindex) \ +#define yyis_table_ninf(yytable_value) \ ]m4_if(m4_eval(b4_table_ninf < b4_table_min), 1, 0, - ((yyindex) == YYTABLE_NINF))[ + ((yytable_value) == YYTABLE_NINF))[ /** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN. * Result R means @@ -753,7 +774,7 @@ yygetLRActions (yyStateNum yystate, int yytoken, *yyaction = -yydefact[yystate]; *yyconflicts = yyconfl; } - else if (! yyis_table_ninf (yyindex)) + else if (! yyis_table_ninf (yytable[yyindex])) { *yyaction = yytable[yyindex]; *yyconflicts = yyconfl + yyconflp[yyindex]; @@ -776,13 +797,13 @@ yyLRgotoState (yyStateNum yystate, yySymbol yylhs) return yydefgoto[yylhs - YYNTOKENS]; } -static inline bool +static inline yybool yyisShiftAction (int yyaction) { return 0 < yyaction; } -static inline bool +static inline yybool yyisErrorAction (int yyaction) { return yyaction == 0; @@ -868,7 +889,7 @@ yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[) yyn -= 1, yyp0 += 1, yyp1 += 1) { *yyp1 = *yyp0; - if (*(bool*) yyp0) + if (*(yybool *) yyp0) { yyGLRState* yys0 = &yyp0->yystate; yyGLRState* yys1 = &yyp1->yystate; @@ -905,7 +926,7 @@ yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[) #else - yyFail (yystack][]b4_lpure_args[, "parser stack overflow"); + yyFail (yystack][]b4_pure_args[, "parser stack overflow"); #endif } @@ -1000,9 +1021,9 @@ yyglrShift (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn, yyexpandGLRStack (yystack]b4_pure_args[); } -/** Shift to a new state on stack #K of STACK, to a new state - * corresponding to LR state LRSTATE, at input position POSN, with - * the (unresolved) semantic value of RHS under the action for RULE. */ +/** Shift stack #K of YYSTACK, to a new state corresponding to LR + * state YYLRSTATE, at input position YYPOSN, with the (unresolved) + * semantic value of YYRHS under the action for YYRULE. */ static inline void yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule]b4_pure_formals[) @@ -1038,7 +1059,8 @@ yydoAction (yyGLRStack* yystack, int yyk, yyRuleNum yyrule, { /* Standard special case: single stack. */ yyGLRStackItem* rhs = (yyGLRStackItem*) yystack->yytops.yystates[yyk]; - assert (yyk == 0); + if (yyk != 0) + abort (); yystack->yynextFree -= yynrhs; yystack->yyspaceLeft += yynrhs; yystack->yytops.yystates[0] = & yystack->yynextFree[-1].yystate; @@ -1059,14 +1081,13 @@ yydoAction (yyGLRStack* yystack, int yyk, yyRuleNum yyrule, { int yyi; yyGLRState* yys; - yyGLRStackItem yyrhsVals[YYMAXRHS]; - for (yyi = yynrhs-1, yys = yystack->yytops.yystates[yyk]; 0 <= yyi; - yyi -= 1, yys = yys->yypred) + yyGLRStackItem yyrhsVals[YYMAXRHS+1]; + yys = yyrhsVals[YYMAXRHS].yystate.yypred = yystack->yytops.yystates[yyk]; + for (yyi = 0; yyi < yynrhs; yyi += 1) { - assert (yys->yypred != NULL); - yyrhsVals[yyi].yystate.yyresolved = yytrue; - yyrhsVals[yyi].yystate.yysemantics.yysval = yys->yysemantics.yysval; - yyrhsVals[yyi].yystate.yyloc = yys->yyloc; + yys = yys->yypred; + if (yys == NULL) + abort (); } yyupdateSplit (yystack, yys); yystack->yytops.yystates[yyk] = yys; @@ -1077,10 +1098,10 @@ yydoAction (yyGLRStack* yystack, int yyk, yyRuleNum yyrule, } else { - *yyvalp = yyrhsVals[0].yystate.yysemantics.yysval; - *yylocp = yyrhsVals[0].yystate.yyloc; + *yyvalp = yyrhsVals[1].yystate.yysemantics.yysval; + *yylocp = yyrhsVals[1].yystate.yyloc; } - return yyuserAction (yyrule, yynrhs, yyrhsVals + (yynrhs-1), + return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS - 1, yyvalp, yylocp, yystack]b4_user_args[); } } @@ -1102,8 +1123,9 @@ static inline void yy_reduce_print (size_t yyk, yyRuleNum yyrule) { int yyi; - YYFPRINTF (stderr, "Reducing stack %d by rule %d (line %d), ", - yyk, yyrule - 1, yyrline[yyrule]); + unsigned int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack %d by rule %d (line %u), ", + yyk, yyrule - 1, yylno); /* Print the symbols being reduced, and their result. */ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) YYFPRINTF (stderr, "%s ", yytokenName (yyrhs[yyi])); @@ -1124,7 +1146,7 @@ yy_reduce_print (size_t yyk, yyRuleNum yyrule) */ static inline YYRESULTTAG yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule, - bool yyforceEval]b4_pure_formals[) + yybool yyforceEval]b4_pure_formals[) { size_t yyposn = yystack->yytops.yystates[yyk]->yyposn; @@ -1151,7 +1173,8 @@ yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule, 0 < yyn; yyn -= 1) { yys = yys->yypred; - assert (yys != NULL); + if (yys == NULL) + abort (); } yyupdateSplit (yystack, yys); yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule)); @@ -1188,7 +1211,8 @@ yysplitStack (yyGLRStack* yystack, int yyk) { if (yystack->yysplitPoint == NULL) { - assert (yyk == 0); + if (yyk != 0) + abort (); yystack->yysplitPoint = yystack->yytops.yystates[yyk]; } if (yystack->yytops.yysize >= yystack->yytops.yycapacity) @@ -1208,7 +1232,7 @@ yysplitStack (yyGLRStack* yystack, int yyk) /** True iff Y0 and Y1 represent identical options at the top level. * That is, they represent the same rule applied to RHS symbols * that produce the same terminal symbols. */ -static bool +static yybool yyidenticalOptions (yySemanticOption* yyy0, yySemanticOption* yyy1) { if (yyy0->yyrule == yyy1->yyrule) @@ -1286,7 +1310,8 @@ yyresolveStates (yyGLRState* yys, int yyn, yyGLRStack* yystack]b4_user_formals[) YYRESULTTAG yyflag; if (0 < yyn) { - assert (yys->yypred != NULL); + if (yys->yypred == NULL) + abort (); yyflag = yyresolveStates (yys->yypred, yyn-1, yystack]b4_user_args[); if (yyflag != yyok) return yyflag; @@ -1307,21 +1332,13 @@ static YYRESULTTAG yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystack, YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[) { - yyGLRStackItem yyrhsVals[YYMAXRHS]; - int yynrhs, yyi; - yyGLRState* yys; + yyGLRStackItem yyrhsVals[YYMAXRHS+1]; + int yynrhs; yynrhs = yyrhsLength (yyopt->yyrule); YYCHK (yyresolveStates (yyopt->yystate, yynrhs, yystack]b4_user_args[)); - for (yyi = yynrhs-1, yys = yyopt->yystate; 0 <= yyi; - yyi -= 1, yys = yys->yypred) - { - assert (yys->yypred != NULL); - yyrhsVals[yyi].yystate.yyresolved = yytrue; - yyrhsVals[yyi].yystate.yysemantics.yysval = yys->yysemantics.yysval; - yyrhsVals[yyi].yystate.yyloc = yys->yyloc; - } - return yyuserAction (yyopt->yyrule, yynrhs, yyrhsVals + (yynrhs-1), + yyrhsVals[YYMAXRHS].yystate.yypred = yyopt->yystate; + return yyuserAction (yyopt->yyrule, yynrhs, yyrhsVals + YYMAXRHS - 1, yyvalp, yylocp, yystack]b4_user_args[); } @@ -1508,7 +1525,8 @@ yyprocessOneStack (yyGLRStack* yystack, int yyk, yyStateNum yystate = yystack->yytops.yystates[yyk]->yylrState; YYDPRINTF ((stderr, "Stack %d Entering state %d\n", yyk, yystate)); - assert (yystate != YYFINAL); + if (yystate == YYFINAL) + abort (); if (yyisDefaultedState (yystate)) { yyrule = yydefaultAction (yystate); @@ -1578,45 +1596,65 @@ yyreportSyntaxError (yyGLRStack* yystack, { #if YYERROR_VERBOSE yySymbol* const yytokenp = yystack->yytokenp; - int yyn, yyx, yycount; - size_t yysize; - const char* yyprefix; - char* yyp; - char* yymsg; + int yyn; yyn = yypact[yystack->yytops.yystates[0]->yylrState]; if (YYPACT_NINF < yyn && yyn < YYLAST) { - yycount = 0; + size_t yysize = 0; + const char* yyprefix; + char* yymsg; + int yyx; + /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ - yysize = sizeof ("syntax error, unexpected ") - + strlen (yytokenName (*yytokenp)); + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + yyprefix = ", expecting "; - for (yyx = yyn < 0 ? -yyn : 0; yyx < yytname_size && yycount <= 5; - yyx += 1) + for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - yysize += strlen (yytokenName (yyx)) + strlen (yyprefix), - yycount += 1, yyprefix = " or "; - yymsg = yyp = (char*) malloc (yysize); - sprintf (yyp, "syntax error, unexpected %s", - yytokenName (*yytokenp)); - yyp += strlen (yyp); - if (yycount < 5) - { - yyprefix = ", expecting "; - for (yyx = yyn < 0 ? -yyn : 0; yyx < yytname_size; yyx += 1) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += strlen (yyprefix) + strlen (yytokenName (yyx)); + yycount += 1; + if (yycount == 5) { - sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx)); - yyp += strlen (yyp); - yyprefix = " or "; + yysize = 0; + break; } + yyprefix = " or "; + } + yysize += (sizeof ("syntax error, unexpected ") + + strlen (yytokenName (*yytokenp))); + yymsg = (char*) malloc (yysize); + if (yymsg != 0) + { + char* yyp = yymsg; + sprintf (yyp, "syntax error, unexpected %s", + yytokenName (*yytokenp)); + yyp += strlen (yyp); + if (yycount < 5) + { + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx)); + yyp += strlen (yyp); + yyprefix = " or "; + } + } + yyerror (]b4_lyyerror_args[yymsg); + free (yymsg); } - yyerror (]b4_lyyerror_args[yymsg); - free (yymsg); + else + yyerror (]b4_lyyerror_args["syntax error; also virtual memory exhausted"); } else -#endif +#endif /* YYERROR_VERBOSE */ yyerror (]b4_lyyerror_args["syntax error"); yynerrs += 1; } @@ -1914,7 +1952,7 @@ yypdumpstack (yyGLRStack* yystack) for (yyp = yystack->yyitems; yyp < yystack->yynextFree; yyp += 1) { fprintf (stderr, "%3lu. ", (unsigned long) (yyp - yystack->yyitems)); - if (*(bool*) yyp) + if (*(yybool *) yyp) { fprintf (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld", yyp->yystate.yyresolved, yyp->yystate.yylrState, @@ -1944,18 +1982,18 @@ yypdumpstack (yyGLRStack* yystack) b4_epilogue m4_if(b4_defines_flag, 0, [], [@output @output_header_name@ -b4_copyright([Skeleton parser for GLR parsing with Bison], [2002]) +b4_copyright([Skeleton parser for GLR parsing with Bison], [2002, 2003]) b4_token_defines(b4_tokens) -#ifndef YYSTYPE +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) m4_ifdef([b4_stype], [b4_syncline([b4_stype_line], [b4_filename]) -typedef union b4_stype yystype; -/* Line __line__ of __file__. */ +typedef union m4_bregexp(b4_stype, [^{], [YYSTYPE ])b4_stype YYSTYPE; +/* Line __line__ of glr.c. */ b4_syncline([@oline@], [@ofile@])], -[typedef int yystype;]) -# define YYSTYPE yystype +[typedef int YYSTYPE;]) +# define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif @@ -1963,15 +2001,16 @@ b4_pure_if([], [extern YYSTYPE b4_prefix[]lval;]) b4_location_if( -[#ifndef YYLTYPE -typedef struct yyltype +[#if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED) +typedef struct YYLTYPE { int first_line; int first_column; int last_line; int last_column; -} yyltype; -# define YYLTYPE yyltype +} YYLTYPE; +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 #endif m4_if(b4_pure, [0],