X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/284acc8ba709220740d9208e748eb686cacc1474..fa0e93148cd17ceb3c55c0173de3d864738e2bcf:/data/glr.c?ds=inline diff --git a/data/glr.c b/data/glr.c index 883c248e..d39b5e0c 100644 --- a/data/glr.c +++ b/data/glr.c @@ -1,7 +1,7 @@ m4_divert(-1) -*- C -*- # GLR skeleton for Bison -# Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2004, 2005 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 @@ -15,8 +15,8 @@ m4_divert(-1) -*- C -*- # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -# 02111-1307 USA +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA ## ---------------- ## @@ -103,7 +103,7 @@ m4_define([b4_lpure_formals], # -------------------- # Expansion of $$. m4_define([b4_lhs_value], -[(*yyvalp)[]m4_ifval([$1], [.$1])]) +[((*yyvalp)[]m4_ifval([$1], [.$1]))]) # b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) @@ -111,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], -[((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3])]) +[(((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3]))]) @@ -131,26 +131,20 @@ m4_define([b4_lhs_location], # Expansion of @NUM, where the current rule has RULE-LENGTH symbols # on RHS. m4_define([b4_rhs_location], -[((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yyloc]) +[(((yyGLRStackItem const *)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, 2003, 2004]) +b4_copyright([Skeleton parser for GLR parsing with Bison], + [2002, 2003, 2004, 2005]) [ /* This is the parser code for GLR (Generalized LR) parser. */ -#include -#include -#include -#include -#include - ]b4_identification m4_if(b4_prefix[], [yy], [], -[/* If NAME_PREFIX is specified substitute the variables and functions - names. */ +[/* Substitute the variable and function names. */ #define yyparse b4_prefix[]parse #define yylex b4_prefix[]lex #define yyerror b4_prefix[]error @@ -205,13 +199,12 @@ typedef struct YYLTYPE # define YYLTYPE_IS_TRIVIAL 1 #endif -/* Default (constant) values used for initialization for null +/* Default (constant) value used for initialization for null 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. */ + here we set the default value of $$ to a zeroed-out value. + Since the default value is undefined, this behavior is + technically correct. */ static YYSTYPE yyval_default; -static YYLTYPE yyloc_default; /* Copy the second part of user declarations. */ ]b4_post_prologue[ @@ -219,6 +212,12 @@ static YYLTYPE yyloc_default; ]/* Line __line__ of glr.c. */ b4_syncline([@oline@], [@ofile@]) [ +#include +#include +#include +#include +#include + #ifndef YYFREE # define YYFREE free #endif @@ -229,6 +228,8 @@ b4_syncline([@oline@], [@ofile@]) # define YYREALLOC realloc #endif +#define YYSIZEMAX ((size_t) -1) + #ifdef __cplusplus typedef bool yybool; #else @@ -246,6 +247,13 @@ b4_syncline([@oline@], [@ofile@]) # if !defined (__GNUC__) || __GNUC__ < 2 || \ (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ # define __attribute__(Spec) /* empty */ +# else +]b4_location_if([# define YYOPTIONAL_LOC(Name) Name],[ +# if defined (__cplusplus) +# define YYOPTIONAL_LOC(Name) /* empty */ +# else +# define YYOPTIONAL_LOC(Name) Name ATTRIBUTE_UNUSED +# endif])[ # endif #endif @@ -420,25 +428,50 @@ static const ]b4_int_type_for([b4_stos])[ yystos[] = /* Error token number */ #define YYTERROR 1 -/* YYLLOC_DEFAULT -- Compute the default location (before the actions - are run). */ +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ ]b4_location_if([[ -#define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc) - +#define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc) #ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \ - ((yyCurrent).first_line = YYRHSLOC(yyRhs, 1).first_line, \ - (yyCurrent).first_column = YYRHSLOC(yyRhs, 1).first_column, \ - (yyCurrent).last_line = YYRHSLOC(yyRhs, YYN).last_line, \ - (yyCurrent).last_column = YYRHSLOC(yyRhs, YYN).last_column) +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (0) + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) #endif ]],[ #ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) ((void) 0) +# define YYLLOC_DEFAULT(Current, Rhs, N) ((void) 0) #endif ])[ +#ifndef YY_LOCATION_PRINT +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +#endif + /* YYLEX -- calling `yylex' with the right arguments. */ #define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[ @@ -486,7 +519,6 @@ do { \ YYFPRINTF (stderr, "%s ", Title); \ yysymprint (stderr, \ Type, Value]b4_location_if([, Location])[); \ - YYFPRINTF (stderr, "\n"); \ } \ } while (0) @@ -513,17 +545,13 @@ int yydebug; SIZE_MAX < YYMAXDEPTH * sizeof (GLRStackItem) evaluated with infinite-precision integer arithmetic. */ -#if YYMAXDEPTH == 0 -# undef YYMAXDEPTH -#endif - #ifndef YYMAXDEPTH # define YYMAXDEPTH ]b4_stack_depth_max[ #endif /* Minimum number of free items on the stack allowed after an allocation. This is to allow allocation and initialization - to be completed by functions that call expandGLRStack before the + to be completed by functions that call yyexpandGLRStack before the stack is expanded, thus insuring that all necessary pointers get properly redirected to new data. */ #define YYHEADROOM 2 @@ -537,6 +565,30 @@ int yydebug; #define YYSTACKEXPANDABLE 0 #endif +#if YYERROR_VERBOSE + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +yystpcpy (char *yydest, const char *yysrc) +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + /** State numbers, as in LALR(1) machine */ typedef int yyStateNum; @@ -556,15 +608,26 @@ typedef struct yyGLRStack yyGLRStack; typedef struct yyGLRStateSet yyGLRStateSet; struct yyGLRState { + /** Type tag: always true. */ yybool yyisState; + /** Type tag for yysemantics. If true, yysval applies, otherwise + * yyfirstVal applies. */ yybool yyresolved; + /** Number of corresponding LALR(1) machine state. */ yyStateNum yylrState; + /** Preceding state in this stack */ yyGLRState* yypred; + /** Source position of the first token produced by my symbol */ size_t yyposn; union { + /** First in a chain of alternative reductions producing the + * non-terminal corresponding to this state, threaded through + * yynext. */ yySemanticOption* yyfirstVal; + /** Semantic value for this state. */ YYSTYPE yysval; } yysemantics; + /** Source location for this state. */ YYLTYPE yyloc; }; @@ -574,12 +637,19 @@ struct yyGLRStateSet { }; struct yySemanticOption { + /** Type tag: always false. */ yybool yyisState; + /** Rule number for this reduction */ yyRuleNum yyrule; + /** The last RHS state in the list of states to be reduced. */ yyGLRState* yystate; + /** Next sibling in chain of options. To facilitate merging, + * options are chained in decreasing order by address. */ yySemanticOption* yynext; }; +/** Type of the items in the GLR stack. The yyisState field + * indicates which item of the union is valid. */ union yyGLRStackItem { yyGLRState yystate; yySemanticOption yyoption; @@ -588,6 +658,8 @@ union yyGLRStackItem { struct yyGLRStack { int yyerrflag; int yyerrState; +]b4_location_if([[ /* To compute the location of the error token. */ + yyGLRStackItem yyerror_range[3];]])[ ]b4_pure_if( [ int yyerrcnt; @@ -597,34 +669,31 @@ struct yyGLRStack { jmp_buf yyexception_buffer; yyGLRStackItem* yyitems; yyGLRStackItem* yynextFree; - int yyspaceLeft; + size_t yyspaceLeft; yyGLRState* yysplitPoint; yyGLRState* yylastDeleted; yyGLRStateSet yytops; }; -static void yyinitGLRStack (yyGLRStack* yystack, size_t yysize); static void yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[); -static void yyfreeGLRStack (yyGLRStack* yystack); static void -yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yyformat, ...) +yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yymsg) { yystack->yyerrflag = 1; - if (yyformat != NULL) - { - char yymsg[256]; - va_list yyap; - va_start (yyap, yyformat); - vsprintf (yymsg, yyformat, yyap); - yyerror (]b4_yyerror_args[yymsg); - } + if (yymsg != NULL) + yyerror (]b4_yyerror_args[yymsg); longjmp (yystack->yyexception_buffer, 1); } +static void +yyStackOverflow (yyGLRStack* yystack]b4_pure_formals[) +{ + yyFail (yystack]b4_pure_args[, "parser stack overflow"); +} + #if YYDEBUG || YYERROR_VERBOSE -/** A printable representation of TOKEN. Valid until next call to - * tokenName. */ +/** A printable representation of TOKEN. */ static inline const char* yytokenName (yySymbol yytoken) { @@ -679,7 +748,9 @@ yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal) * yyerr for YYERROR, yyabort for YYABORT. */ static YYRESULTTAG yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, - YYSTYPE* yyvalp, YYLTYPE* yylocp, yyGLRStack* yystack + YYSTYPE* yyvalp, + YYLTYPE* YYOPTIONAL_LOC (yylocp), + yyGLRStack* yystack ]b4_user_formals[) { yybool yynormal ATTRIBUTE_UNUSED = (yystack->yysplitPoint == NULL); @@ -706,20 +777,15 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, yylow = 1; if (yyrhslen == 0) - { - *yyvalp = yyval_default; - *yylocp = yyloc_default; - } + *yyvalp = yyval_default; else - { - *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval; - YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen); - } - + *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval; + YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen); ] switch (yyn) { b4_actions + default: break; } return yyok; @@ -866,13 +932,16 @@ yyaddDeferredAction (yyGLRStack* yystack, yyGLRState* yystate, /* GLRStacks */ /** Initialize SET to a singleton set containing an empty stack. */ -static void +static yybool yyinitStateSet (yyGLRStateSet* yyset) { yyset->yysize = 1; yyset->yycapacity = 16; yyset->yystates = (yyGLRState**) YYMALLOC (16 * sizeof yyset->yystates[0]); + if (! yyset->yystates) + return yyfalse; yyset->yystates[0] = NULL; + return yytrue; } static void yyfreeStateSet (yyGLRStateSet* yyset) @@ -882,7 +951,7 @@ static void yyfreeStateSet (yyGLRStateSet* yyset) /** Initialize STACK to a single empty stack, with total maximum * capacity for all stacks of SIZE. */ -static void +static yybool yyinitGLRStack (yyGLRStack* yystack, size_t yysize) { yystack->yyerrflag = 0; @@ -893,7 +962,7 @@ yyinitGLRStack (yyGLRStack* yystack, size_t yysize) (yyGLRStackItem*) YYMALLOC (yysize * sizeof yystack->yynextFree[0]); yystack->yysplitPoint = NULL; yystack->yylastDeleted = NULL; - yyinitStateSet (&yystack->yytops); + return yyinitStateSet (&yystack->yytops) && yystack->yyitems; } #define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \ @@ -908,18 +977,20 @@ static void yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[) { #if YYSTACKEXPANDABLE - yyGLRStack yynewStack; + yyGLRStackItem* yynewItems; yyGLRStackItem* yyp0, *yyp1; size_t yysize, yynewSize; size_t yyn; yysize = yystack->yynextFree - yystack->yyitems; if (YYMAXDEPTH <= yysize) - yyFail (yystack][]b4_pure_args[, "parser stack overflow"); + yyStackOverflow (yystack]b4_pure_args[); yynewSize = 2*yysize; if (YYMAXDEPTH < yynewSize) yynewSize = YYMAXDEPTH; - yyinitGLRStack (&yynewStack, yynewSize); - for (yyp0 = yystack->yyitems, yyp1 = yynewStack.yyitems, yyn = yysize; + yynewItems = (yyGLRStackItem*) YYMALLOC (yynewSize * sizeof yynewItems[0]); + if (! yynewItems) + yyStackOverflow (yystack]b4_pure_args[); + for (yyp0 = yystack->yyitems, yyp1 = yynewItems, yyn = yysize; 0 < yyn; yyn -= 1, yyp0 += 1, yyp1 += 1) { @@ -946,22 +1017,22 @@ yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[) } } if (yystack->yysplitPoint != NULL) - yystack->yysplitPoint = YYRELOC (yystack->yyitems, yynewStack.yyitems, + yystack->yysplitPoint = YYRELOC (yystack->yyitems, yynewItems, yystack->yysplitPoint, yystate); for (yyn = 0; yyn < yystack->yytops.yysize; yyn += 1) if (yystack->yytops.yystates[yyn] != NULL) yystack->yytops.yystates[yyn] = - YYRELOC (yystack->yyitems, yynewStack.yyitems, + YYRELOC (yystack->yyitems, yynewItems, yystack->yytops.yystates[yyn], yystate); YYFREE (yystack->yyitems); - yystack->yyitems = yynewStack.yyitems; - yystack->yynextFree = yynewStack.yynextFree + yysize; - yystack->yyspaceLeft = yynewStack.yyspaceLeft - yysize; + yystack->yyitems = yynewItems; + yystack->yynextFree = yynewItems + yysize; + yystack->yyspaceLeft = yynewSize - yysize; #else - yyFail (yystack][]b4_pure_args[, "parser stack overflow"); + yyStackOverflow (yystack]b4_pure_args[); #endif } @@ -984,7 +1055,7 @@ yyupdateSplit (yyGLRStack* yystack, yyGLRState* yys) /** Invalidate stack #K in STACK. */ static inline void -yymarkStackDeleted (yyGLRStack* yystack, int yyk) +yymarkStackDeleted (yyGLRStack* yystack, size_t yyk) { if (yystack->yytops.yystates[yyk] != NULL) yystack->yylastDeleted = yystack->yytops.yystates[yyk]; @@ -1037,7 +1108,8 @@ yyremoveDeletes (yyGLRStack* yystack) /** Shift to a new state on stack #K of STACK, corresponding to LR state * LRSTATE, at input position POSN, with (resolved) semantic value SVAL. */ static inline void -yyglrShift (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn, +yyglrShift (yyGLRStack* yystack, size_t yyk, yyStateNum yylrState, + size_t yyposn, YYSTYPE yysval, YYLTYPE* yylocp]b4_user_formals[) { yyGLRStackItem* yynewItem; @@ -1061,7 +1133,7 @@ yyglrShift (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn, * 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, +yyglrShiftDefer (yyGLRStack* yystack, size_t yyk, yyStateNum yylrState, size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule]b4_pure_formals[) { yyGLRStackItem* yynewItem; @@ -1086,7 +1158,7 @@ yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState, * and *LOCP to the computed location (if any). Return value is as * for userAction. */ static inline YYRESULTTAG -yydoAction (yyGLRStack* yystack, int yyk, yyRuleNum yyrule, +yydoAction (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule, YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[) { int yynrhs = yyrhsLength (yyrule); @@ -1220,8 +1292,8 @@ yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule, return yyok; } -static int -yysplitStack (yyGLRStack* yystack, int yyk) +static size_t +yysplitStack (yyGLRStack* yystack, size_t yyk]b4_pure_formals[) { if (yystack->yysplitPoint == NULL) { @@ -1230,11 +1302,15 @@ yysplitStack (yyGLRStack* yystack, int yyk) } if (yystack->yytops.yysize >= yystack->yytops.yycapacity) { - yystack->yytops.yycapacity *= 2; - yystack->yytops.yystates = - (yyGLRState**) YYREALLOC (yystack->yytops.yystates, - (yystack->yytops.yycapacity - * sizeof yystack->yytops.yystates[0])); + yyGLRState** yynewStates; + if (! ((yystack->yytops.yycapacity + <= (YYSIZEMAX / (2 * sizeof yynewStates[0]))) + && (yynewStates = + (yyGLRState**) YYREALLOC (yystack->yytops.yystates, + ((yystack->yytops.yycapacity *= 2) + * sizeof yynewStates[0]))))) + yyStackOverflow (yystack]b4_pure_args[); + yystack->yytops.yystates = yynewStates; } yystack->yytops.yystates[yystack->yytops.yysize] = yystack->yytops.yystates[yyk]; @@ -1264,9 +1340,8 @@ yyidenticalOptions (yySemanticOption* yyy0, yySemanticOption* yyy1) return yyfalse; } -/** Assuming identicalOptions (Y0,Y1), (destructively) merge the - * alternative semantic values for the RHS-symbols of Y1 into the - * corresponding semantic value sets of the symbols of Y0. */ +/** Assuming identicalOptions (Y0,Y1), destructively merge the + * alternative semantic values for the RHS-symbols of Y1 and Y0. */ static void yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1) { @@ -1276,16 +1351,46 @@ yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1) yyn = yyrhsLength (yyy0->yyrule); yyn > 0; yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1) - if (yys0 == yys1) - break; - else if (! yys0->yyresolved && ! yys1->yyresolved) - { - yySemanticOption* yyz; - for (yyz = yys0->yysemantics.yyfirstVal; yyz->yynext != NULL; - yyz = yyz->yynext) - continue; - yyz->yynext = yys1->yysemantics.yyfirstVal; - } + { + if (yys0 == yys1) + break; + else if (yys0->yyresolved) + { + yys1->yyresolved = yytrue; + yys1->yysemantics.yysval = yys0->yysemantics.yysval; + } + else if (yys1->yyresolved) + { + yys0->yyresolved = yytrue; + yys0->yysemantics.yysval = yys1->yysemantics.yysval; + } + else + { + yySemanticOption** yyz0p; + yySemanticOption* yyz1; + yyz0p = &yys0->yysemantics.yyfirstVal; + yyz1 = yys1->yysemantics.yyfirstVal; + while (yytrue) + { + if (yyz1 == *yyz0p || yyz1 == NULL) + break; + else if (*yyz0p == NULL) + { + *yyz0p = yyz1; + break; + } + else if (*yyz0p < yyz1) + { + yySemanticOption* yyz = *yyz0p; + *yyz0p = yyz1; + yyz1 = yyz1->yynext; + (*yyz0p)->yynext = yyz; + } + yyz0p = &(*yyz0p)->yynext; + } + yys1->yysemantics.yyfirstVal = yys0->yysemantics.yyfirstVal; + } + } } /** Y0 and Y1 represent two possible actions to take in a given @@ -1431,10 +1536,10 @@ yyresolveValue (yySemanticOption* yyoptionList, yyGLRStack* yystack, { yySemanticOption* yybest; yySemanticOption* yyp; - int yymerge; + yybool yymerge; yybest = yyoptionList; - yymerge = 0; + yymerge = yyfalse; for (yyp = yyoptionList->yynext; yyp != NULL; yyp = yyp->yynext) { if (yyidenticalOptions (yybest, yyp)) @@ -1446,13 +1551,13 @@ yyresolveValue (yySemanticOption* yyoptionList, yyGLRStack* yystack, yyreportAmbiguity (yybest, yyp, yystack]b4_pure_args[); break; case 1: - yymerge = 1; + yymerge = yytrue; break; case 2: break; case 3: yybest = yyp; - yymerge = 0; + yymerge = yyfalse; break; } } @@ -1526,9 +1631,9 @@ yycompressStack (yyGLRStack* yystack) } static YYRESULTTAG -yyprocessOneStack (yyGLRStack* yystack, int yyk, +yyprocessOneStack (yyGLRStack* yystack, size_t yyk, size_t yyposn, YYSTYPE* yylvalp, YYLTYPE* yyllocp - ]b4_user_formals[) + ]b4_pure_formals[) { int yyaction; const short int* yyconflicts; @@ -1538,7 +1643,8 @@ yyprocessOneStack (yyGLRStack* yystack, int yyk, while (yystack->yytops.yystates[yyk] != NULL) { yyStateNum yystate = yystack->yytops.yystates[yyk]->yylrState; - YYDPRINTF ((stderr, "Stack %d Entering state %d\n", yyk, yystate)); + YYDPRINTF ((stderr, "Stack %lu Entering state %d\n", + (unsigned long int) yyk, yystate)); YYASSERT (yystate != YYFINAL); @@ -1547,7 +1653,8 @@ yyprocessOneStack (yyGLRStack* yystack, int yyk, yyrule = yydefaultAction (yystate); if (yyrule == 0) { - YYDPRINTF ((stderr, "Stack %d dies.\n", yyk)); + YYDPRINTF ((stderr, "Stack %lu dies.\n", + (unsigned long int) yyk)); yymarkStackDeleted (yystack, yyk); return yyok; } @@ -1561,34 +1668,37 @@ yyprocessOneStack (yyGLRStack* yystack, int yyk, yychar = YYLEX; *yytokenp = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", *yytokenp, yylvalp, yyllocp); + YYDPRINTF ((stderr, "\n")); } yygetLRActions (yystate, *yytokenp, &yyaction, &yyconflicts); while (*yyconflicts != 0) { - int yynewStack = yysplitStack (yystack, yyk); - YYDPRINTF ((stderr, "Splitting off stack %d from %d.\n", - yynewStack, yyk)); + size_t yynewStack = yysplitStack (yystack, yyk]b4_pure_args[); + YYDPRINTF ((stderr, "Splitting off stack %lu from %lu.\n", + (unsigned long int) yynewStack, + (unsigned long int) yyk)); YYCHK (yyglrReduce (yystack, yynewStack, *yyconflicts, yyfalse]b4_lpure_args[)); YYCHK (yyprocessOneStack (yystack, yynewStack, yyposn, - yylvalp, yyllocp]b4_user_args[)); + yylvalp, yyllocp]b4_pure_args[)); yyconflicts += 1; } if (yyisShiftAction (yyaction)) { - YYDPRINTF ((stderr, "Shifting token %s on stack %d, ", - yytokenName (*yytokenp), yyk)); + YYDPRINTF ((stderr, "On stack %lu, ", (unsigned long int) yyk)); + YY_SYMBOL_PRINT ("shifting", *yytokenp, yylvalp, yyllocp); yyglrShift (yystack, yyk, yyaction, yyposn+1, *yylvalp, yyllocp]b4_user_args[); - YYDPRINTF ((stderr, "which is now in state #%d\n", + YYDPRINTF ((stderr, ", now in state #%d\n", yystack->yytops.yystates[yyk]->yylrState)); break; } else if (yyisErrorAction (yyaction)) { - YYDPRINTF ((stderr, "Stack %d dies.\n", yyk)); + YYDPRINTF ((stderr, "Stack %lu dies.\n", + (unsigned long int) yyk)); yymarkStackDeleted (yystack, yyk); break; } @@ -1615,10 +1725,24 @@ yyreportSyntaxError (yyGLRStack* yystack, yyn = yypact[yystack->yytops.yystates[0]->yylrState]; if (YYPACT_NINF < yyn && yyn < YYLAST) { - size_t yysize = 0; - const char* yyprefix; - char* yymsg; + size_t yysize0 = strlen (yytokenName (*yytokenp)); + size_t yysize = yysize0; + size_t yysize1; + yybool yysize_overflow = yyfalse; + char* yymsg = NULL; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ @@ -1627,41 +1751,53 @@ yyreportSyntaxError (yyGLRStack* yystack, /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 0; + int yycount = 1; + + yyarg[0] = yytokenName (*yytokenp); + yyfmt = yystpcpy (yyformat, yyunexpected); - yyprefix = ", expecting "; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { - yysize += strlen (yyprefix) + strlen (yytokenName (yyx)); - yycount += 1; - if (yycount == 5) + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { - yysize = 0; + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; break; } - yyprefix = " or "; + yyarg[yycount++] = yytokenName (yyx); + yysize1 = yysize + strlen (yytokenName (yyx)); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; } - yysize += (sizeof ("syntax error, unexpected ") - + strlen (yytokenName (*yytokenp))); - yymsg = (char*) YYMALLOC (yysize); - if (yymsg != 0) + + yyf = yyformat; + yysize1 = yysize + (yyfmt - yyformat); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + + if (!yysize_overflow) + yymsg = (char *) YYMALLOC (yysize); + + if (yymsg) { - char* yyp = yymsg; - sprintf (yyp, "syntax error%s%s", - (*yytokenp == YYEMPTY ? "" : ", unexpected "), - yytokenName (*yytokenp)); - yyp += strlen (yyp); - if (yycount < 5) + char *yyp = yymsg; + int yyi = 0; + while ((*yyp = *yyf)) { - 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 "; - } + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp = yystpcpy (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } } yyerror (]b4_lyyerror_args[yymsg); YYFREE (yymsg); @@ -1681,7 +1817,9 @@ yyreportSyntaxError (yyGLRStack* yystack, value, and location of the look-ahead. */ static void yyrecoverSyntaxError (yyGLRStack* yystack, - YYSTYPE* yylvalp, YYLTYPE* yyllocp]b4_user_formals[) + YYSTYPE* yylvalp, + YYLTYPE* YYOPTIONAL_LOC (yyllocp) + ]b4_user_formals[) { yySymbol* const yytokenp = yystack->yytokenp; size_t yyk; @@ -1698,10 +1836,9 @@ yyrecoverSyntaxError (yyGLRStack* yystack, while (yystack->yytops.yystates[0] != NULL) { yyGLRState *yys = yystack->yytops.yystates[0]; - YY_SYMBOL_PRINT ("Error: popping", - yystos[yys->yylrState], - &yys->yysemantics.yysval, &yys->yyloc); - yydestruct (yystos[yys->yylrState], +]b4_location_if([[ yystack->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[ + yydestruct ("Error: popping", + yystos[yys->yylrState], &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[); yystack->yytops.yystates[0] = yys->yypred; yystack->yynextFree -= 1; @@ -1710,14 +1847,22 @@ yyrecoverSyntaxError (yyGLRStack* yystack, yyFail (yystack][]b4_lpure_args[, NULL); } if (*yytokenp != YYEMPTY) - { - YY_SYMBOL_PRINT ("Error: discarding", *yytokenp, yylvalp, yyllocp); - yydestruct (*yytokenp, yylvalp]b4_location_if([, yyllocp])[); + {]b4_location_if([[ + /* We throw away the lookahead, but the error range + of the shifted error token must take it into account. */ + yyGLRState *yys = yystack->yytops.yystates[0]; + yyGLRStackItem yyerror_range[3]; + yyerror_range[1].yystate.yyloc = yys->yyloc; + yyerror_range[2].yystate.yyloc = *yyllocp; + YYLLOC_DEFAULT (yys->yyloc, yyerror_range, 2);]])[ + yydestruct ("Error: discarding", + *yytokenp, yylvalp]b4_location_if([, yyllocp])[); } YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; *yytokenp = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", *yytokenp, yylvalp, yyllocp); + YYDPRINTF ((stderr, "\n")); yyj = yypact[yystack->yytops.yystates[0]->yylrState]; if (yyis_pact_ninf (yyj)) return; @@ -1754,16 +1899,22 @@ yyrecoverSyntaxError (yyGLRStack* yystack, if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR && yyisShiftAction (yytable[yyj])) { - YYDPRINTF ((stderr, "Shifting error token, ")); + /* Shift the error token having adjusted its location. */ + YYLTYPE yyerrloc;]b4_location_if([[ + yystack->yyerror_range[2].yystate.yyloc = *yyllocp; + YYLLOC_DEFAULT (yyerrloc, yystack->yyerror_range, 2);]])[ + YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]], + yylvalp, &yyerrloc); + YYDPRINTF ((stderr, "\n")); yyglrShift (yystack, 0, yytable[yyj], - yys->yyposn, *yylvalp, yyllocp]b4_user_args[); + yys->yyposn, *yylvalp, &yyerrloc]b4_user_args[); + yys = yystack->yytops.yystates[0]; break; } } - YY_SYMBOL_PRINT ("Error: popping", - yystos[yys->yylrState], - &yys->yysemantics.yysval, &yys->yyloc); - yydestruct (yystos[yys->yylrState], +]b4_location_if([[ yystack->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[ + yydestruct ("Error: popping", + yystos[yys->yylrState], &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[); yystack->yytops.yystates[0] = yys->yypred; yystack->yynextFree -= 1; @@ -1810,16 +1961,35 @@ yyrecoverSyntaxError (yyGLRStack* yystack, YYSTYPE* const yylvalp = &yylval; YYLTYPE* const yyllocp = &yylloc; - yyinitGLRStack (&yystack, YYINITDEPTH); - yystack.yytokenp = &yytoken; - YYDPRINTF ((stderr, "Starting parse\n")); + yytoken = YYEMPTY; + if (setjmp (yystack.yyexception_buffer) != 0) goto yyDone; - yyglrShift (&yystack, 0, 0, 0, yyval_default, &yyloc_default]b4_user_args[); - yytoken = YYEMPTY; + if (! yyinitGLRStack (&yystack, YYINITDEPTH)) + goto yyDone; + yystack.yytokenp = &yytoken; + + yylval = yyval_default; +]b4_location_if([ +#if YYLTYPE_IS_TRIVIAL + yylloc.first_line = yylloc.last_line = 1; + yylloc.first_column = yylloc.last_column = 0; +#endif +]) +m4_ifdef([b4_initial_action], [ +m4_pushdef([b4_at_dollar], [yylval])dnl +m4_pushdef([b4_dollar_dollar], [yylloc])dnl + /* User initialization code. */ + b4_initial_action +m4_popdef([b4_dollar_dollar])dnl +m4_popdef([b4_at_dollar])dnl +/* Line __line__ of glr.c. */ +b4_syncline([@oline@], [@ofile@])])dnl +[ + yyglrShift (&yystack, 0, 0, 0, yylval, &yylloc]b4_user_args[); yyposn = 0; while (yytrue) @@ -1843,6 +2013,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack, yyrule = yydefaultAction (yystate); if (yyrule == 0) { +]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = *yyllocp;]])[ yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); goto yyuser_error; } @@ -1856,14 +2027,15 @@ yyrecoverSyntaxError (yyGLRStack* yystack, yychar = YYLEX; yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, yylvalp, yyllocp); + YYDPRINTF ((stderr, "\n")); } yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts); if (*yyconflicts != 0) break; if (yyisShiftAction (yyaction)) { - YYDPRINTF ((stderr, "Shifting token %s, ", - yytokenName (yytoken))); + YY_SYMBOL_PRINT ("Shifting", yytoken, yylvalp, yyllocp); + YYDPRINTF ((stderr, "\n")); if (yytoken != YYEOF) yytoken = YYEMPTY; yyposn += 1; @@ -1874,6 +2046,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack, } else if (yyisErrorAction (yyaction)) { +]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = *yyllocp;]])[ yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); goto yyuser_error; } @@ -1884,11 +2057,11 @@ yyrecoverSyntaxError (yyGLRStack* yystack, while (yytrue) { - int yys; - int yyn = yystack.yytops.yysize; + size_t yys; + size_t yyn = yystack.yytops.yysize; for (yys = 0; yys < yyn; yys += 1) YYCHK1 (yyprocessOneStack (&yystack, yys, yyposn, - yylvalp, yyllocp]b4_user_args[)); + yylvalp, yyllocp]b4_lpure_args[)); yytoken = YYEMPTY; yyposn += 1; yyremoveDeletes (&yystack); @@ -1899,6 +2072,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack, yyFail (&yystack][]b4_lpure_args[, "syntax error"); YYCHK1 (yyresolveStack (&yystack]b4_user_args[)); YYDPRINTF ((stderr, "Returning to deterministic operation.\n")); +]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = *yyllocp;]])[ yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); goto yyuser_error; } @@ -1916,7 +2090,10 @@ yyrecoverSyntaxError (yyGLRStack* yystack, yyposn = yystack.yytops.yystates[0]->yyposn; } yyDone: - ; + /* On YYABORT, free the lookahead. */ + if (yystack.yyerrflag == 1 && yytoken != YYEMPTY) + yydestruct ("Error: discarding lookahead", + yytoken, yylvalp]b4_location_if([, yyllocp])[); yyfreeGLRStack (&yystack); return yystack.yyerrflag; @@ -1924,7 +2101,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack, /* DEBUGGING ONLY */ #ifdef YYDEBUG -static void yypstack (yyGLRStack* yystack, int yyk) ATTRIBUTE_UNUSED; +static void yypstack (yyGLRStack* yystack, size_t yyk) ATTRIBUTE_UNUSED; static void yypdumpstack (yyGLRStack* yystack) ATTRIBUTE_UNUSED; static void @@ -1949,7 +2126,7 @@ yypstates (yyGLRState* yyst) } static void -yypstack (yyGLRStack* yystack, int yyk) +yypstack (yyGLRStack* yystack, size_t yyk) { yypstates (yystack->yytops.yystates[yyk]); } @@ -1997,7 +2174,8 @@ 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, 2003, 2004]) +b4_copyright([Skeleton parser for GLR parsing with Bison], + [2002, 2003, 2004, 2005]) b4_token_defines(b4_tokens) @@ -2031,7 +2209,7 @@ b4_location_if([ # define YYLTYPE_IS_TRIVIAL 1 #endif -b4_location_if([m4_if(b4_pure, [0], +b4_location_if([b4_pure_if([], [extern YYLTYPE b4_prefix[]lloc;]) ]) ])