X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/1154ccedaf2f504455446e484932c5c9ffd2a18e..fc8f2965383e318c8be2a20865edb7303f0420ee:/data/glr.c diff --git a/data/glr.c b/data/glr.c index 8918aa89..17634dba 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 @@ -19,6 +18,87 @@ m4_include([c.m4]) # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA # 02111-1307 USA + +## ---------------- ## +## Default values. ## +## ---------------- ## + +# Stack parameters. +m4_define_default([b4_stack_depth_max], [10000]) +m4_define_default([b4_stack_depth_init], [200]) + + + +## ------------------------ ## +## Pure/impure interfaces. ## +## ------------------------ ## + + +# b4_lex_param +# ------------ +# Accumule in b4_lex_param all the yylex arguments. +# Yes, this is quite ugly... +m4_define([b4_lex_param], +m4_dquote(b4_pure_if([[[[YYSTYPE *]], [[yylvalp]]][]dnl +b4_location_if([, [[YYLTYPE *], [yyllocp]]])])dnl +m4_ifdef([b4_lex_param], [, ]b4_lex_param))) + + +# b4_user_formals +# --------------- +m4_define([b4_user_formals], +[m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])]) + + +# b4_yyerror_args +# --------------- +# Arguments passed to yyerror: user args plus yylloc. +m4_define([b4_yyerror_args], +[b4_pure_if([b4_location_if([yylocp, ])])dnl +m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])]) + + +# b4_lyyerror_args +# ---------------- +# Same as above, but on the lookahead, hence yyllocp instead of yylocp. +m4_define([b4_lyyerror_args], +[b4_pure_if([b4_location_if([yyllocp, ])])dnl +m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])]) + + +# b4_pure_args +# ------------ +# Arguments needed by yyerror: user args plus yylloc. +m4_define([b4_pure_args], +[b4_pure_if([b4_location_if([, yylocp])])[]b4_user_args]) + + +# b4_pure_formals +# --------------- +# Arguments passed to yyerror: user formals plus yyllocp. +m4_define([b4_pure_formals], +[b4_pure_if([b4_location_if([, YYLTYPE *yylocp])])[]b4_user_formals]) + + +# b4_lpure_args +# ------------- +# Same as above, but on the lookahead, hence yyllocp instead of yylocp. +m4_define([b4_lpure_args], +[b4_pure_if([b4_location_if([, yyllocp])])[]b4_user_args]) + + +# b4_lpure_formals +# ---------------- +# Same as above, but on the lookahead, hence yyllocp instead of yylocp. +m4_define([b4_lpure_formals], +[b4_pure_if([b4_location_if([YYLTYPE *yyllocp])])[]b4_user_formals]) + + +## ----------------- ## +## Semantic Values. ## +## ----------------- ## + + # b4_lhs_value([TYPE]) # -------------------- # Expansion of $$. @@ -31,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])]) @@ -39,15 +119,6 @@ m4_define([b4_rhs_value], ## Locations. ## ## ----------- ## -# b4_location_if(IF-TRUE, IF-FALSE) -# --------------------------------- -# Expand IF-TRUE, if locations are used, IF-FALSE otherwise. -m4_define([b4_location_if], -[m4_if(b4_locations_flag, [1], - [$1], - [$2])]) - - # b4_lhs_location() # ----------------- # Expansion of @$. @@ -60,70 +131,24 @@ 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]) - - - -## -------------- ## -## %pure-parser. ## -## -------------- ## - -# b4_pure_if(IF-TRUE, IF-FALSE) -# ----------------------------- -# Expand IF-TRUE, if %pure-parser, IF-FALSE otherwise. -m4_define([b4_pure_if], -[m4_if(b4_pure, [1], - [$1], - [$2])]) - - -## ------------------- ## -## Output file names. ## -## ------------------- ## - -m4_define_default([b4_input_suffix], [.y]) - -m4_define_default([b4_output_parser_suffix], -[m4_translit(b4_input_suffix, [yY], [cC])]) - -m4_define_default([b4_output_parser_name], -[b4_output_prefix[]b4_output_infix[]b4_output_parser_suffix[]]) - - -m4_define_default([b4_output_header_suffix], -[m4_translit(b4_input_suffix, [yY], [hH])]) - -m4_define_default([b4_output_header_name], -[b4_output_prefix[]b4_output_infix[]b4_output_header_suffix[]]) - -m4_define_default([b4_header_guard], - [m4_bpatsubst(m4_toupper([BISON_]b4_output_header_name), - [[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]], [_])]) - +[yyvsp@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yyloc]) +# We do want M4 expansion after # for CPP macros. +m4_changecom() m4_divert(0)dnl -#output "b4_output_parser_name" -b4_copyright([Skeleton parser for GLR parsing with Bison], [2002]) +@output @output_parser_name@ +b4_copyright([Skeleton parser for GLR parsing with Bison], [2002, 2003]) [ /* This is the parser code for GLR (Generalized LR) parser. */ -/* FIXME: minimize these */ -#include -#include #include +#include +#include #include -#include - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Pure parsers. */ -#define YYPURE ]b4_pure[ - -/* Using locations. */ -#define YYLSP_NEEDED ]b4_locations_flag[ +#include -]m4_if(b4_prefix[], [yy], [], +]b4_identification +m4_if(b4_prefix[], [yy], [], [/* If NAME_PREFIX is specified substitute the variables and functions names. */ #define yyparse b4_prefix[]parse @@ -135,10 +160,10 @@ b4_copyright([Skeleton parser for GLR parsing with Bison], [2002]) #define yynerrs b4_prefix[]nerrs b4_location_if([#define yylloc b4_prefix[]lloc])]) -/* Copy the first part of user declarations. */ -b4_pre_prologue +b4_token_defines(b4_tokens) -b4_token_defines(b4_tokens)[ +/* Copy the first part of user declarations. */ +b4_pre_prologue[ /* Enabling traces. */ #ifndef YYDEBUG @@ -153,33 +178,36 @@ b4_token_defines(b4_tokens)[ # define YYERROR_VERBOSE ]b4_error_verbose[ #endif -#ifndef YYSTYPE +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) ]m4_ifdef([b4_stype], -[#line b4_stype_line "b4_filename" -typedef union b4_stype yystype; -/* Line __line__ of __file__. */ -#line __oline__ "__ofile__"], -[typedef int yystype;])[ -# define YYSTYPE yystype +[b4_syncline([b4_stype_line], [b4_filename]) +typedef union m4_bregexp(b4_stype, [^{], [YYSTYPE ])b4_stype YYSTYPE; +/* Line __line__ of glr.c. */ +b4_syncline([@oline@], [@ofile@])], +[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 { ]b4_location_if([ - int yyfirst_line; - int yyfirst_column; - int yylast_line; - int yylast_column;])[ -} yyltype; -# define YYLTYPE ]b4_ltype[ + int first_line; + int first_column; + int last_line; + int last_column; +],[ + char yydummy; +])[ +} 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, - here we set the default values of the $$ and $@ to zeroed-out + 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. */ static YYSTYPE yyval_default; @@ -188,14 +216,26 @@ static YYLTYPE yyloc_default; /* Copy the second part of user declarations. */ ]b4_post_prologue[ -]/* Line __line__ of __file__. */ -#line __oline__ "__ofile__" +]/* Line __line__ of glr.c. */ +b4_syncline([@oline@], [@ofile@]) [ -#if ! defined (__cplusplus) - typedef char bool; -# define yytrue 1 -# define yyfalse 0 +#ifndef YYFREE +# define YYFREE free +#endif +#ifndef YYMALLOC +# define YYMALLOC malloc #endif +#ifndef YYREALLOC +# define YYREALLOC realloc +#endif + +#ifdef __cplusplus + typedef bool yybool; +#else + typedef unsigned char yybool; +#endif +#define yytrue 1 +#define yyfalse 0 /*-----------------. | GCC extensions. | @@ -209,39 +249,43 @@ static YYLTYPE yyloc_default; # endif #endif -#ifndef ATTRIBUTE_UNUSED -# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +#ifndef YYASSERT +# define YYASSERT(condition) ((void) ((condition) || (abort (), 0))) #endif -#if ! defined (__GNUC__) -# define inline +#ifndef ATTRIBUTE_UNUSED +# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) #endif /* YYFINAL -- State number of the termination state. */ -#define YYFINAL ]b4_final[ -#define YYFLAG ]b4_flag[ +#define YYFINAL ]b4_final_state_number[ +/* YYLAST -- Last index in YYTABLE. */ #define YYLAST ]b4_last[ /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS ]b4_ntokens[ +#define YYNTOKENS ]b4_tokens_number[ /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS ]b4_nnts[ +#define YYNNTS ]b4_nterms_number[ /* YYNRULES -- Number of rules. */ -#define YYNRULES ]b4_nrules[ +#define YYNRULES ]b4_rules_number[ /* YYNRULES -- Number of states. */ -#define YYNSTATES ]b4_nstates[ +#define YYNSTATES ]b4_states_number[ /* YYMAXRHS -- Maximum number of symbols on right-hand side of rule. */ #define YYMAXRHS ]b4_r2_max[ +/* YYMAXLEFT -- Maximum number of symbols to the left of a handle + accessed by $0, $-1, etc., in any rule. */ +#define YYMAXLEFT ]b4_max_left_semantic_context[ /* YYTRANSLATE(X) -- Bison symbol number corresponding to X. */ #define YYUNDEFTOK ]b4_undef_token_number[ #define YYMAXUTOK ]b4_user_token_number_max[ -#define YYTRANSLATE(YYX) \ - ((unsigned)(YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) +#define YYTRANSLATE(YYX) \ + ((YYX <= 0) ? YYEOF : \ + (unsigned)(YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const ]b4_uint_type(b4_translate_max)[ yytranslate[] = +static const ]b4_int_type_for([b4_translate])[ yytranslate[] = { ]b4_translate[ }; @@ -249,19 +293,19 @@ static const ]b4_uint_type(b4_translate_max)[ yytranslate[] = #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ -static const ]b4_uint_type(b4_prhs_max)[ yyprhs[] = +static const ]b4_int_type_for([b4_prhs])[ yyprhs[] = { ]b4_prhs[ }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const ]b4_sint_type(b4_rhs_max)[ yyrhs[] = +static const ]b4_int_type_for([b4_rhs])[ yyrhs[] = { ]b4_rhs[ }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const ]b4_uint_type(b4_rline_max)[ yyrline[] = +static const ]b4_int_type_for([b4_rline])[ yyrline[] = { ]b4_rline[ }; @@ -274,30 +318,28 @@ 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. */ -static const ]b4_uint_type(b4_r1_max)[ yyr1[] = +static const ]b4_int_type_for([b4_r1])[ yyr1[] = { ]b4_r1[ }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const ]b4_uint_type(b4_r2_max)[ yyr2[] = +static const ]b4_int_type_for([b4_r2])[ yyr2[] = { ]b4_r2[ }; /* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none). */ -static const short yydprec[] = +static const ]b4_int_type_for([b4_dprec])[ yydprec[] = { ]b4_dprec[ }; /* YYMERGER[RULE-NUM] -- Index of merging function for rule #RULE-NUM. */ -static const short yymerger[] = +static const ]b4_int_type_for([b4_merger])[ yymerger[] = { ]b4_merger[ }; @@ -305,80 +347,75 @@ static const short yymerger[] = /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ -static const short yydefact[] = +static const ]b4_int_type_for([b4_defact])[ yydefact[] = { ]b4_defact[ }; -/* YYPGOTO[NTERM-NUM]. */ -static const short yydefgoto[] = +/* YYPDEFGOTO[NTERM-NUM]. */ +static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] = { ]b4_defgoto[ }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -static const short yypact[] = +#define YYPACT_NINF ]b4_pact_ninf[ +static const ]b4_int_type_for([b4_pact])[ yypact[] = { ]b4_pact[ }; /* YYPGOTO[NTERM-NUM]. */ -static const short yypgoto[] = +static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] = { ]b4_pgoto[ }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. */ -static const short yytable[] = + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF ]b4_table_ninf[ +static const ]b4_int_type_for([b4_table])[ yytable[] = { ]b4_table[ }; -/* YYCONFLP[YYPACT[STATE-NUM]] -- pointer into yyconfl of start of list - of conflicting reductions corresponding to action entry for state - STATE-NUM in yytable. 0 means no conflicts. The list in yyconfl - is terminated by a rule number of 0. */ -static const short yyconflp[] = +/* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of + list of conflicting reductions corresponding to action entry for + state STATE-NUM in yytable. 0 means no conflicts. The list in + yyconfl is terminated by a rule number of 0. */ +static const ]b4_int_type_for([b4_conflict_list_heads])[ yyconflp[] = { ]b4_conflict_list_heads[ }; -/* YYCONFL[I] -- lists of conflicting rule numbers, each terminated - by 0, pointed into by YYCONFLP. */ -static const short yyconfl[] = +/* YYCONFL[I] -- lists of conflicting rule numbers, each terminated by + 0, pointed into by YYCONFLP. */ +]dnl Do not use b4_int_type_for here, since there are places where +dnl pointers onto yyconfl are taken, which type is "short *". +dnl We probably ought to introduce a type for confl. +[static const short yyconfl[] = { ]b4_conflicting_rules[ }; -static const short yycheck[] = +static const ]b4_int_type_for([b4_check])[ yycheck[] = { ]b4_check[ }; +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const ]b4_int_type_for([b4_stos])[ yystos[] = +{ + ]b4_stos[ +}; + -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#else /* !YYPARSE_PARAM */ -# define YYPARSE_PARAM_ARG void -#endif /* !YYPARSE_PARAM */ - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -# ifdef YYPARSE_PARAM -int yyparse (void *); -# else -int yyparse (void); -# endif -#endif +/* Prevent warning if -Wmissing-prototypes. */ +]b4_c_ansi_function_decl([yyparse], [int], b4_parse_param)[ /* Error token number */ #define YYTERROR 1 @@ -386,29 +423,28 @@ int yyparse (void); /* YYLLOC_DEFAULT -- Compute the default location (before the actions are run). */ -#define YYRHSLOC(yyRhs,YYK) (yyRhs[YYK].yystate.yyloc) +]b4_location_if([[ +#define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc) #ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \ - yyCurrent.yyfirst_line = YYRHSLOC(yyRhs,1).yyfirst_line; \ - yyCurrent.yyfirst_column = YYRHSLOC(yyRhs,1).yyfirst_column; \ - yyCurrent.yylast_line = YYRHSLOC(yyRhs,YYN).yylast_line; \ - yyCurrent.yylast_column = YYRHSLOC(yyRhs,YYN).yylast_column; +# 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) #endif +]],[ +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) ((void) 0) +#endif +])[ + /* YYLEX -- calling `yylex' with the right arguments. */ +#define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[ ]b4_pure_if( [ -#ifdef YYLEX_PARAM -# define YYLEX yylex (yylvalp, b4_location_if([yyllocp, ])YYLEX_PARAM) -#else -# define YYLEX yylex (yylvalp[]b4_location_if([, yyllocp])) -#endif], -[#define YYLEX yylex ()]) - -b4_pure_if( -[ #undef yynerrs #define yynerrs (yystack->yyerrcnt) #undef yychar @@ -426,7 +462,7 @@ static const int YYEMPTY = -2; typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG; #define YYCHK(YYE) \ - do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; } \ + do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; } \ while (0) #if YYDEBUG @@ -440,17 +476,42 @@ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) + +]b4_yysymprint_generate([b4_c_ansi_function_def])[ + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value]b4_location_if([, Location])[); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; + #else /* !YYDEBUG */ + /* Avoid empty `if' bodies. */ -# define YYDPRINTF(Args) {} +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) + #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH -# define YYINITDEPTH ]b4_initdepth[ +# define YYINITDEPTH ]b4_stack_depth_init[ #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only @@ -465,7 +526,7 @@ int yydebug; #endif #ifndef YYMAXDEPTH -# define YYMAXDEPTH ]b4_maxdepth[ +# define YYMAXDEPTH ]b4_stack_depth_max[ #endif /* Minimum number of free items on the stack allowed after an @@ -475,8 +536,10 @@ 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([[defined (YYLTYPE_IS_TRIVIAL) && YYLTYPE_IS_TRIVIAL \ + && ]])[defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) #define YYSTACKEXPANDABLE 1 #else #define YYSTACKEXPANDABLE 0 @@ -501,8 +564,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; @@ -519,7 +582,7 @@ struct yyGLRStateSet { }; struct yySemanticOption { - bool yyisState; + yybool yyisState; yyRuleNum yyrule; yyGLRState* yystate; yySemanticOption* yynext; @@ -549,20 +612,20 @@ struct yyGLRStack { }; static void yyinitGLRStack (yyGLRStack* yystack, size_t yysize); -static void yyexpandGLRStack (yyGLRStack* yystack); +static void yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[); static void yyfreeGLRStack (yyGLRStack* yystack); static void -yyFail (yyGLRStack* yystack, const char* yyformat, ...) +yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yyformat, ...) { + yystack->yyerrflag = 1; if (yyformat != NULL) { char yymsg[256]; va_list yyap; va_start (yyap, yyformat); - yystack->yyerrflag = 1; vsprintf (yymsg, yyformat, yyap); - yyerror (yymsg); + yyerror (]b4_yyerror_args[yymsg); } longjmp (yystack->yyexception_buffer, 1); } @@ -577,30 +640,56 @@ 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. */ +static void yyfillin (yyGLRStackItem *, int, int) ATTRIBUTE_UNUSED; +static void +yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1) +{ + yyGLRState* s; + int i; + s = yyvsp[yylow0].yystate.yypred; + for (i = yylow0-1; i >= yylow1; i -= 1) + { + YYASSERT (s->yyresolved); + 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; + } +} + +/* Do nothing if YYNORMAL or if *YYLOW <= YYLOW1. Otherwise, fill in + YYVSP[YYLOW1 .. *YYLOW-1] as in yyfillin and set *YYLOW = YYLOW1. + For convenience, always return YYLOW1. */ +static inline int yyfill (yyGLRStackItem *, int *, int, yybool) + ATTRIBUTE_UNUSED; +static inline int +yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal) +{ + if (!yynormal && yylow1 < *yylow) + { + yyfillin (yyvsp, *yylow, yylow1); + *yylow = yylow1; + } + 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 - * (@$). Returns yyok for normal return, yyaccept for YYACCEPT, + * (@@$). Returns yyok for normal return, yyaccept for YYACCEPT, * yyerr for YYERROR, yyabort for YYABORT. */ static YYRESULTTAG yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, - YYSTYPE* yyvalp, YYLTYPE* yylocp, yyGLRStack* yystack) + YYSTYPE* yyvalp, YYLTYPE* yylocp, yyGLRStack* yystack + ]b4_user_formals[) { - /* Avoid `unused' warnings in there are no $n. */ - (void) yystack; + yybool yynormal ATTRIBUTE_UNUSED = (yystack->yysplitPoint == NULL); + int yylow; - if (yyrhslen == 0) - { - *yyvalp = yyval_default; - *yylocp = yyloc_default; - } - else - { - *yyvalp = yyvsp[1-yyrhslen].yystate.yysemantics.yysval; - *yylocp = yyvsp[1-yyrhslen].yystate.yyloc; - } -# undef yyval -# define yyval (*yyvalp) # undef yyerrok # define yyerrok (yystack->yyerrState = 0) # undef YYACCEPT @@ -608,26 +697,37 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, # undef YYABORT # define YYABORT return yyabort # undef YYERROR -# define YYERROR return yyerr +# define YYERROR return yyerrok, yyerr # undef YYRECOVERING # define YYRECOVERING (yystack->yyerrState != 0) # undef yyclearin # define yyclearin (yychar = *(yystack->yytokenp) = YYEMPTY) +# undef YYFILL +# define YYFILL(N) yyfill (yyvsp, &yylow, N, yynormal) # undef YYBACKUP # define YYBACKUP(Token, Value) \ - do { \ - yyerror ("syntax error: cannot back up"); \ - YYERROR; \ - } while (0) + return yyerror (]b4_yyerror_args["syntax error: cannot back up"), \ + yyerrok, yyerr + + yylow = 1; + if (yyrhslen == 0) + { + *yyvalp = yyval_default; + *yylocp = yyloc_default; + } + else + { + *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval; + YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen); + } ] - switch (yyn) - { - b4_actions - } + switch (yyn) + { + b4_actions + } - return yyok; -# undef yyval + return yyok; # undef yyerrok # undef YYABORT # undef YYACCEPT @@ -635,16 +735,15 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, # undef YYBACKUP # undef yyclearin # undef YYRECOVERING -/* Line __line__ of __file__. */ -#line __oline__ "__ofile__" +/* Line __line__ of glr.c. */ +b4_syncline([@oline@], [@ofile@]) } -static YYSTYPE +static void yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1) { - YYSTYPE yyval = *yy0; - /* `Use' the arguments. */ + /* `Use' the arguments. */ (void) yy0; (void) yy1; @@ -652,10 +751,11 @@ yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1) { b4_mergers } - return yyval; } [ - /* Bison grammar-table manipulation */ + /* Bison grammar-table manipulation. */ + +]b4_yydestruct_generate([b4_c_ansi_function_def])[ /** Number of symbols composing the right hand side of rule #RULE. */ static inline int @@ -671,12 +771,17 @@ yylhsNonterm (yyRuleNum yyrule) return yyr1[yyrule]; } +#define yyis_pact_ninf(yystate) \ + ]m4_if(m4_eval(b4_pact_ninf < b4_pact_min), 1, + 0, + ((yystate) == YYPACT_NINF))[ + /** True iff LR state STATE has only a default reduction (regardless * of token). */ -static inline bool +static inline yybool yyisDefaultedState (yyStateNum yystate) { - return yypact[yystate] == YYFLAG; + return yyis_pact_ninf (yypact[yystate]); } /** The default reduction for STATE, assuming it has one. */ @@ -686,7 +791,12 @@ yydefaultAction (yyStateNum yystate) return yydefact[yystate]; } -/** Set *ACTION to the action to take in STATE on seeing TOKEN. +#define yyis_table_ninf(yytable_value) \ + ]m4_if(m4_eval(b4_table_ninf < b4_table_min), 1, + 0, + ((yytable_value) == YYTABLE_NINF))[ + +/** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN. * Result R means * R < 0: Reduce on rule -R. * R = 0: Error. @@ -699,16 +809,21 @@ yygetLRActions (yyStateNum yystate, int yytoken, int* yyaction, const short** yyconflicts) { int yyindex = yypact[yystate] + yytoken; - if (yyindex < 0 || yyindex > YYLAST || yycheck[yyindex] != yytoken) + if (yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken) { *yyaction = -yydefact[yystate]; *yyconflicts = yyconfl; } - else + else if (! yyis_table_ninf (yytable[yyindex])) { *yyaction = yytable[yyindex]; *yyconflicts = yyconfl + yyconflp[yyindex]; } + else + { + *yyaction = 0; + *yyconflicts = yyconfl + yyconflp[yyindex]; + } } static inline yyStateNum @@ -716,49 +831,41 @@ yyLRgotoState (yyStateNum yystate, yySymbol yylhs) { int yyr; yyr = yypgoto[yylhs - YYNTOKENS] + yystate; - if (yyr >= 0 && yyr <= YYLAST && yycheck[yyr] == yystate) + if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate) return yytable[yyr]; else return yydefgoto[yylhs - YYNTOKENS]; } -static inline bool +static inline yybool yyisShiftAction (int yyaction) { - return yyaction > 0; + return 0 < yyaction; } -static inline bool +static inline yybool yyisErrorAction (int yyaction) { - return yyaction == 0 || yyaction == YYFLAG; + return yyaction == 0; } /* GLRStates */ -/** True iff the semantic value of the edge leading to STATE is - * resolved. */ -static inline bool -yyhasResolvedValue (yyGLRState* yystate) -{ - return yystate->yyresolved; -} - static void yyaddDeferredAction (yyGLRStack* yystack, yyGLRState* yystate, - yyGLRState* yyrhs, yyRuleNum yyrule) + yyGLRState* rhs, yyRuleNum yyrule]b4_pure_formals[) { yySemanticOption* yynewItem; yynewItem = &yystack->yynextFree->yyoption; yystack->yyspaceLeft -= 1; yystack->yynextFree += 1; yynewItem->yyisState = yyfalse; - yynewItem->yystate = yyrhs; + yynewItem->yystate = rhs; yynewItem->yyrule = yyrule; yynewItem->yynext = yystate->yysemantics.yyfirstVal; yystate->yysemantics.yyfirstVal = yynewItem; if (yystack->yyspaceLeft < YYHEADROOM) - yyexpandGLRStack (yystack); + yyexpandGLRStack (yystack]b4_pure_args[); } /* GLRStacks */ @@ -769,13 +876,13 @@ yyinitStateSet (yyGLRStateSet* yyset) { yyset->yysize = 1; yyset->yycapacity = 16; - yyset->yystates = (yyGLRState**) malloc (16 * sizeof (yyset->yystates[0])); + yyset->yystates = YYMALLOC (16 * sizeof yyset->yystates[0]); yyset->yystates[0] = NULL; } static void yyfreeStateSet (yyGLRStateSet* yyset) { - free (yyset->yystates); + YYFREE (yyset->yystates); } /** Initialize STACK to a single empty stack, with total maximum @@ -788,7 +895,7 @@ yyinitGLRStack (yyGLRStack* yystack, size_t yysize) yynerrs = 0; yystack->yyspaceLeft = yysize; yystack->yynextFree = yystack->yyitems = - (yyGLRStackItem*) malloc (yysize * sizeof (yystack->yynextFree[0])); + YYMALLOC (yysize * sizeof yystack->yynextFree[0]); yystack->yysplitPoint = NULL; yystack->yylastDeleted = NULL; yyinitStateSet (&yystack->yytops); @@ -803,7 +910,7 @@ yyinitGLRStack (yyGLRStack* yystack, size_t yysize) allocation, so that we can avoid having external pointers exist across an allocation. */ static void -yyexpandGLRStack (yyGLRStack* yystack) +yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[) { #if YYSTACKEXPANDABLE yyGLRStack yynewStack; @@ -811,18 +918,18 @@ yyexpandGLRStack (yyGLRStack* yystack) size_t yysize, yynewSize; size_t yyn; yysize = yystack->yynextFree - yystack->yyitems; - if (yysize >= YYMAXDEPTH) - yyFail (yystack, "parsing stack overflow (%d items)", yysize); + if (YYMAXDEPTH <= yysize) + yyFail (yystack][]b4_pure_args[, "parser stack overflow"); yynewSize = 2*yysize; - if (yynewSize > YYMAXDEPTH) + if (YYMAXDEPTH < yynewSize) yynewSize = YYMAXDEPTH; yyinitGLRStack (&yynewStack, yynewSize); for (yyp0 = yystack->yyitems, yyp1 = yynewStack.yyitems, yyn = yysize; - yyn > 0; + 0 < yyn; yyn -= 1, yyp0 += 1, yyp1 += 1) { *yyp1 = *yyp0; - if (*(bool*) yyp0) + if (*(yybool *) yyp0) { yyGLRState* yys0 = &yyp0->yystate; yyGLRState* yys1 = &yyp1->yystate; @@ -852,22 +959,21 @@ yyexpandGLRStack (yyGLRStack* yystack) yystack->yytops.yystates[yyn] = YYRELOC (yystack->yyitems, yynewStack.yyitems, yystack->yytops.yystates[yyn], yystate); - free (yystack->yyitems); + YYFREE (yystack->yyitems); yystack->yyitems = yynewStack.yyitems; yystack->yynextFree = yynewStack.yynextFree + yysize; yystack->yyspaceLeft = yynewStack.yyspaceLeft - yysize; #else - yyFail (yystack, "parsing stack overflow (%d items)", yysize); - + yyFail (yystack][]b4_pure_args[, "parser stack overflow"); #endif } static void yyfreeGLRStack (yyGLRStack* yystack) { - free (yystack->yyitems); + YYFREE (yystack->yyitems); yyfreeStateSet (&yystack->yytops); } @@ -914,14 +1020,19 @@ yyremoveDeletes (yyGLRStack* yystack) if (yystack->yytops.yystates[yyi] == NULL) { if (yyi == yyj) - YYDPRINTF ((stderr, "Removing dead stacks.\n")); + { + YYDPRINTF ((stderr, "Removing dead stacks.\n")); + } yystack->yytops.yysize -= 1; } else { yystack->yytops.yystates[yyj] = yystack->yytops.yystates[yyi]; if (yyj != yyi) - YYDPRINTF ((stderr, "Rename stack %d -> %d.\n", yyi, yyj)); + { + YYDPRINTF ((stderr, "Rename stack %lu -> %lu.\n", + (unsigned long int) yyi, (unsigned long int) yyj)); + } yyj += 1; } yyi += 1; @@ -932,7 +1043,7 @@ yyremoveDeletes (yyGLRStack* yystack) * LRSTATE, at input position POSN, with (resolved) semantic value SVAL. */ static inline void yyglrShift (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn, - YYSTYPE yysval, YYLTYPE* yylocp) + YYSTYPE yysval, YYLTYPE* yylocp]b4_user_formals[) { yyGLRStackItem* yynewItem; @@ -948,15 +1059,15 @@ yyglrShift (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn, yynewItem->yystate.yysemantics.yysval = yysval; yynewItem->yystate.yyloc = *yylocp; if (yystack->yyspaceLeft < YYHEADROOM) - yyexpandGLRStack (yystack); + 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* yyrhs, yyRuleNum yyrule) + size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule]b4_pure_formals[) { yyGLRStackItem* yynewItem; @@ -970,7 +1081,7 @@ yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState, yystack->yytops.yystates[yyk] = &yynewItem->yystate; yystack->yynextFree += 1; yystack->yyspaceLeft -= 1; - yyaddDeferredAction (yystack, &yynewItem->yystate, yyrhs, yyrule); + yyaddDeferredAction (yystack, &yynewItem->yystate, rhs, yyrule]b4_pure_args[); } /** Pop the symbols consumed by reduction #RULE from the top of stack @@ -979,62 +1090,69 @@ yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState, * have been previously resolved. Set *VALP to the resulting value, * and *LOCP to the computed location (if any). Return value is as * for userAction. */ -static inline int +static inline YYRESULTTAG yydoAction (yyGLRStack* yystack, int yyk, yyRuleNum yyrule, - YYSTYPE* yyvalp, YYLTYPE* yylocp) + YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[) { int yynrhs = yyrhsLength (yyrule); if (yystack->yysplitPoint == NULL) { /* Standard special case: single stack. */ - yyGLRStackItem* yyrhs = (yyGLRStackItem*) yystack->yytops.yystates[yyk]; - assert (yyk == 0); + yyGLRStackItem* rhs = (yyGLRStackItem*) yystack->yytops.yystates[yyk]; + YYASSERT (yyk == 0); yystack->yynextFree -= yynrhs; yystack->yyspaceLeft += yynrhs; yystack->yytops.yystates[0] = & yystack->yynextFree[-1].yystate; - if (yynrhs == 0) - { - *yyvalp = yyval_default; - *yylocp = yyloc_default; - } - else - { - *yyvalp = yyrhs[1-yynrhs].yystate.yysemantics.yysval; - *yylocp = yyrhs[1-yynrhs].yystate.yyloc; - } - return yyuserAction (yyrule, yynrhs, yyrhs, yyvalp, yylocp, yystack); + return yyuserAction (yyrule, yynrhs, rhs, + yyvalp, yylocp, yystack]b4_user_args[); } else { int yyi; yyGLRState* yys; - yyGLRStackItem yyrhsVals[YYMAXRHS]; - for (yyi = yynrhs-1, yys = yystack->yytops.yystates[yyk]; yyi >= 0; - yyi -= 1, yys = yys->yypred) + yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1]; + yys = yyrhsVals[YYMAXRHS + YYMAXLEFT].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; + YYASSERT (yys); } yyupdateSplit (yystack, yys); yystack->yytops.yystates[yyk] = yys; - if (yynrhs == 0) - { - *yyvalp = yyval_default; - *yylocp = yyloc_default; - } - else - { - *yyvalp = yyrhsVals[0].yystate.yysemantics.yysval; - *yylocp = yyrhsVals[0].yystate.yyloc; - } - return yyuserAction (yyrule, yynrhs, yyrhsVals + (yynrhs-1), - yyvalp, yylocp, yystack); + return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, + yyvalp, yylocp, yystack]b4_user_args[); } } +#if !YYDEBUG +# define YY_REDUCE_PRINT(K, Rule) +#else +# define YY_REDUCE_PRINT(K, Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (K, Rule); \ +} while (0) + +/*----------------------------------------------------------. +| Report that the RULE is going to be reduced on stack #K. | +`----------------------------------------------------------*/ + +static inline void +yy_reduce_print (size_t yyk, yyRuleNum yyrule) +{ + int yyi; + YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu), ", + (unsigned long int) yyk, yyrule - 1, + (unsigned long int) yyrline[yyrule]); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytokenName (yyrhs[yyi])); + YYFPRINTF (stderr, "-> %s\n", yytokenName (yyr1[yyrule])); +} +#endif + /** Pop items off stack #K of STACK according to grammar rule RULE, * and push back on the resulting nonterminal symbol. Perform the * semantic action associated with RULE and store its value with the @@ -1048,7 +1166,7 @@ yydoAction (yyGLRStack* yystack, int yyk, yyRuleNum yyrule, */ static inline YYRESULTTAG yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule, - bool yyforceEval) + yybool yyforceEval]b4_pure_formals[) { size_t yyposn = yystack->yytops.yystates[yyk]->yyposn; @@ -1057,13 +1175,12 @@ yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule, YYSTYPE yysval; YYLTYPE yyloc; - YYCHK (yydoAction (yystack, yyk, yyrule, &yysval, &yyloc)); + YY_REDUCE_PRINT (yyk, yyrule); + YYCHK (yydoAction (yystack, yyk, yyrule, &yysval, &yyloc]b4_user_args[)); yyglrShift (yystack, yyk, yyLRgotoState (yystack->yytops.yystates[yyk]->yylrState, yylhsNonterm (yyrule)), - yyposn, yysval, &yyloc); - YYDPRINTF ((stderr, "Reduced stack %d by rule #%d. Now in state %d.\n", - yyk, yyrule-1, yystack->yytops.yystates[yyk]->yylrState)); + yyposn, yysval, &yyloc]b4_user_args[); } else { @@ -1073,17 +1190,16 @@ yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule, yyStateNum yynewLRState; for (yys = yystack->yytops.yystates[yyk], yyn = yyrhsLength (yyrule); - yyn > 0; yyn -= 1) + 0 < yyn; yyn -= 1) { yys = yys->yypred; - assert (yys != NULL); + YYASSERT (yys); } yyupdateSplit (yystack, yys); yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule)); YYDPRINTF ((stderr, - "Reduced stack %d by rule #%d; action deferred. " - "Now in state %d.\n", - yyk, yyrule-1, yynewLRState)); + "Reduced stack %lu by rule #%d; action deferred. Now in state %d.\n", + (unsigned long int) yyk, yyrule - 1, yynewLRState)); for (yyi = 0; yyi < yystack->yytops.yysize; yyi += 1) if (yyi != yyk && yystack->yytops.yystates[yyi] != NULL) { @@ -1093,19 +1209,20 @@ yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule, { if (yyp->yylrState == yynewLRState && yyp->yypred == yys) { - yyaddDeferredAction (yystack, yyp, yys0, yyrule); + yyaddDeferredAction (yystack, yyp, yys0, yyrule]b4_pure_args[); yymarkStackDeleted (yystack, yyk); - YYDPRINTF ((stderr, "Merging stack %d into stack %d.\n", - yyk, yyi)); - return 0; + YYDPRINTF ((stderr, "Merging stack %lu into stack %lu.\n", + (unsigned long int) yyk, + (unsigned long int) yyi)); + return yyok; } yyp = yyp->yypred; } } yystack->yytops.yystates[yyk] = yys; - yyglrShiftDefer (yystack, yyk, yynewLRState, yyposn, yys0, yyrule); + yyglrShiftDefer (yystack, yyk, yynewLRState, yyposn, yys0, yyrule]b4_pure_args[); } - return 0; + return yyok; } static int @@ -1113,16 +1230,16 @@ yysplitStack (yyGLRStack* yystack, int yyk) { if (yystack->yysplitPoint == NULL) { - assert (yyk == 0); + YYASSERT (yyk == 0); yystack->yysplitPoint = yystack->yytops.yystates[yyk]; } if (yystack->yytops.yysize >= yystack->yytops.yycapacity) { yystack->yytops.yycapacity *= 2; yystack->yytops.yystates = - (yyGLRState**) realloc (yystack->yytops.yystates, - yystack->yytops.yycapacity - * sizeof (yyGLRState*)); + YYREALLOC (yystack->yytops.yystates, + (yystack->yytops.yycapacity + * sizeof yystack->yytops.yystates[0])); } yystack->yytops.yystates[yystack->yytops.yysize] = yystack->yytops.yystates[yyk]; @@ -1133,7 +1250,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) @@ -1171,7 +1288,7 @@ yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1) yySemanticOption* yyz; for (yyz = yys0->yysemantics.yyfirstVal; yyz->yynext != NULL; yyz = yyz->yynext) - ; + continue; yyz->yynext = yys1->yysemantics.yyfirstVal; } } @@ -1196,29 +1313,30 @@ yypreference (yySemanticOption* y0, yySemanticOption* y1) return 0; if (p0 < p1) return 3; - if (p0 > p1) + if (p1 < p0) return 2; return 0; } static YYRESULTTAG yyresolveValue (yySemanticOption* yyoptionList, yyGLRStack* yystack, YYSTYPE* yyvalp, - YYLTYPE* yylocp); + YYLTYPE* yylocp]b4_user_formals[); static YYRESULTTAG -yyresolveStates (yyGLRState* yys, int yyn, yyGLRStack* yystack) +yyresolveStates (yyGLRState* yys, int yyn, yyGLRStack* yystack]b4_user_formals[) { YYRESULTTAG yyflag; - if (yyn > 0) + if (0 < yyn) { - assert (yys->yypred != NULL); - yyflag = yyresolveStates (yys->yypred, yyn-1, yystack); + YYASSERT (yys->yypred); + yyflag = yyresolveStates (yys->yypred, yyn-1, yystack]b4_user_args[); if (yyflag != yyok) return yyflag; if (! yys->yyresolved) { yyflag = yyresolveValue (yys->yysemantics.yyfirstVal, yystack, - &yys->yysemantics.yysval, &yys->yyloc); + &yys->yysemantics.yysval, &yys->yyloc + ]b4_user_args[); if (yyflag != yyok) return yyflag; yys->yyresolved = yytrue; @@ -1229,51 +1347,48 @@ yyresolveStates (yyGLRState* yys, int yyn, yyGLRStack* yystack) static YYRESULTTAG yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystack, - YYSTYPE* yyvalp, YYLTYPE* yylocp) + YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[) { - yyGLRStackItem yyrhsVals[YYMAXRHS]; - int yynrhs, yyi; - yyGLRState* yys; + yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1]; + int yynrhs; yynrhs = yyrhsLength (yyopt->yyrule); - YYCHK (yyresolveStates (yyopt->yystate, yynrhs, yystack)); - for (yyi = yynrhs-1, yys = yyopt->yystate; yyi >= 0; - 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), - yyvalp, yylocp, yystack); + YYCHK (yyresolveStates (yyopt->yystate, yynrhs, yystack]b4_user_args[)); + yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred = yyopt->yystate; + return yyuserAction (yyopt->yyrule, yynrhs, + yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, + yyvalp, yylocp, yystack]b4_user_args[); } #if YYDEBUG -static yyGLRState YYLEFTMOST_STATE = { 0, NULL, -1, 0, { NULL } }; - -static void yyreportTree (yySemanticOption* yyx, int yyindent) +static void +yyreportTree (yySemanticOption* yyx, int yyindent) { int yynrhs = yyrhsLength (yyx->yyrule); int yyi; yyGLRState* yys; yyGLRState* yystates[YYMAXRHS]; + yyGLRState yyleftmost_state; - for (yyi = yynrhs, yys = yyx->yystate; yyi > 0; yyi -= 1, yys = yys->yypred) + for (yyi = yynrhs, yys = yyx->yystate; 0 < yyi; yyi -= 1, yys = yys->yypred) yystates[yyi] = yys; if (yys == NULL) - yystates[0] = &YYLEFTMOST_STATE; + { + yyleftmost_state.yyposn = 0; + yystates[0] = &yyleftmost_state; + } else yystates[0] = yys; - if (yys->yyposn+1 > yyx->yystate->yyposn) + if (yyx->yystate->yyposn < yys->yyposn + 1) YYFPRINTF (stderr, "%*s%s -> \n", yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)), yyx->yyrule); else - YYFPRINTF (stderr, "%*s%s -> \n", + YYFPRINTF (stderr, "%*s%s -> \n", yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)), - yyx->yyrule, yys->yyposn+1, yyx->yystate->yyposn); + yyx->yyrule, (unsigned long int) (yys->yyposn + 1), + (unsigned long int) yyx->yystate->yyposn); for (yyi = 1; yyi <= yynrhs; yyi += 1) { if (yystates[yyi]->yyresolved) @@ -1282,9 +1397,10 @@ static void yyreportTree (yySemanticOption* yyx, int yyindent) YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1])); else - YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", + YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]), - yystates[yyi-1]->yyposn+1, yystates[yyi]->yyposn); + (unsigned long int) (yystates[yyi - 1]->yyposn + 1), + (unsigned long int) yystates[yyi]->yyposn); } else yyreportTree (yystates[yyi]->yysemantics.yyfirstVal, yyindent+2); @@ -1294,7 +1410,7 @@ static void yyreportTree (yySemanticOption* yyx, int yyindent) static void yyreportAmbiguity (yySemanticOption* yyx0, yySemanticOption* yyx1, - yyGLRStack* yystack) + yyGLRStack* yystack]b4_pure_formals[) { /* `Unused' warnings. */ (void) yyx0; @@ -1308,7 +1424,7 @@ yyreportAmbiguity (yySemanticOption* yyx0, yySemanticOption* yyx1, yyreportTree (yyx1, 2); YYFPRINTF (stderr, "\n"); #endif - yyFail (yystack, "ambiguity detected"); + yyFail (yystack][]b4_pure_args[, "ambiguity detected"); } @@ -1316,7 +1432,7 @@ yyreportAmbiguity (yySemanticOption* yyx0, yySemanticOption* yyx1, * actions, and return the result. */ static YYRESULTTAG yyresolveValue (yySemanticOption* yyoptionList, yyGLRStack* yystack, - YYSTYPE* yyvalp, YYLTYPE* yylocp) + YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[) { yySemanticOption* yybest; yySemanticOption* yyp; @@ -1332,7 +1448,7 @@ yyresolveValue (yySemanticOption* yyoptionList, yyGLRStack* yystack, switch (yypreference (yybest, yyp)) { case 0: - yyreportAmbiguity (yybest, yyp, yystack); + yyreportAmbiguity (yybest, yyp, yystack]b4_pure_args[); break; case 1: yymerge = 1; @@ -1349,25 +1465,25 @@ yyresolveValue (yySemanticOption* yyoptionList, yyGLRStack* yystack, if (yymerge) { int yyprec = yydprec[yybest->yyrule]; - YYCHK (yyresolveAction (yybest, yystack, yyvalp, yylocp)); + YYCHK (yyresolveAction (yybest, yystack, yyvalp, yylocp]b4_user_args[)); for (yyp = yybest->yynext; yyp != NULL; yyp = yyp->yynext) { if (yyprec == yydprec[yyp->yyrule]) { YYSTYPE yyval1; YYLTYPE yydummy; - YYCHK (yyresolveAction (yyp, yystack, &yyval1, &yydummy)); - *yyvalp = yyuserMerge (yymerger[yyp->yyrule], yyvalp, &yyval1); + YYCHK (yyresolveAction (yyp, yystack, &yyval1, &yydummy]b4_user_args[)); + yyuserMerge (yymerger[yyp->yyrule], yyvalp, &yyval1); } } return yyok; } else - return yyresolveAction (yybest, yystack, yyvalp, yylocp); + return yyresolveAction (yybest, yystack, yyvalp, yylocp]b4_user_args[); } static YYRESULTTAG -yyresolveStack (yyGLRStack* yystack) +yyresolveStack (yyGLRStack* yystack]b4_user_formals[) { if (yystack->yysplitPoint != NULL) { @@ -1377,8 +1493,9 @@ yyresolveStack (yyGLRStack* yystack) for (yyn = 0, yys = yystack->yytops.yystates[0]; yys != yystack->yysplitPoint; yys = yys->yypred, yyn += 1) - ; - YYCHK (yyresolveStates (yystack->yytops.yystates[0], yyn, yystack)); + continue; + YYCHK (yyresolveStates (yystack->yytops.yystates[0], yyn, yystack + ]b4_user_args[)); } return yyok; } @@ -1415,7 +1532,8 @@ yycompressStack (yyGLRStack* yystack) static YYRESULTTAG yyprocessOneStack (yyGLRStack* yystack, int yyk, - size_t yyposn, YYSTYPE* yylvalp, YYLTYPE* yyllocp) + size_t yyposn, YYSTYPE* yylvalp, YYLTYPE* yyllocp + ]b4_user_formals[) { int yyaction; const short* yyconflicts; @@ -1425,8 +1543,10 @@ 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)); + + YYASSERT (yystate != YYFINAL); - assert (yystate != YYFINAL); if (yyisDefaultedState (yystate)) { yyrule = yydefaultAction (yystate); @@ -1436,15 +1556,16 @@ yyprocessOneStack (yyGLRStack* yystack, int yyk, yymarkStackDeleted (yystack, yyk); return yyok; } - YYCHK (yyglrReduce (yystack, yyk, yyrule, yyfalse)); + YYCHK (yyglrReduce (yystack, yyk, yyrule, yyfalse]b4_lpure_args[)); } else { if (*yytokenp == YYEMPTY) { + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; - *yytokenp = YYTRANSLATE(yychar); - YYDPRINTF ((stderr, "Read token %s\n", yytokenName (*yytokenp))); + *yytokenp = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", *yytokenp, yylvalp, yyllocp); } yygetLRActions (yystate, *yytokenp, &yyaction, &yyconflicts); @@ -1453,17 +1574,19 @@ yyprocessOneStack (yyGLRStack* yystack, int yyk, int yynewStack = yysplitStack (yystack, yyk); YYDPRINTF ((stderr, "Splitting off stack %d from %d.\n", yynewStack, yyk)); - YYCHK (yyglrReduce (yystack, yynewStack, *yyconflicts, yyfalse)); + YYCHK (yyglrReduce (yystack, yynewStack, + *yyconflicts, yyfalse]b4_lpure_args[)); YYCHK (yyprocessOneStack (yystack, yynewStack, yyposn, - yylvalp, yyllocp)); + yylvalp, yyllocp]b4_user_args[)); yyconflicts += 1; } if (yyisShiftAction (yyaction)) { - YYDPRINTF ((stderr, "Shifted token %s on stack %d, ", + YYDPRINTF ((stderr, "Shifting token %s on stack %d, ", yytokenName (*yytokenp), yyk)); - yyglrShift (yystack, yyk, yyaction, yyposn+1, *yylvalp, yyllocp); + yyglrShift (yystack, yyk, yyaction, yyposn+1, + *yylvalp, yyllocp]b4_user_args[); YYDPRINTF ((stderr, "which is now in state #%d\n", yystack->yytops.yystates[yyk]->yylrState)); break; @@ -1475,14 +1598,15 @@ yyprocessOneStack (yyGLRStack* yystack, int yyk, break; } else - YYCHK (yyglrReduce (yystack, yyk, -yyaction, yyfalse)); + YYCHK (yyglrReduce (yystack, yyk, -yyaction, yyfalse]b4_lpure_args[)); } } return yyok; } static void -yyreportParseError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp) +yyreportSyntaxError (yyGLRStack* yystack, + YYSTYPE* yylvalp, YYLTYPE* yyllocp]b4_user_formals[) { /* `Unused' warnings. */ (void) yylvalp; @@ -1492,119 +1616,165 @@ yyreportParseError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp) { #if YYERROR_VERBOSE yySymbol* const yytokenp = yystack->yytokenp; - int yyn, yyx, yycount, yysize; - const char* yyprefix; - char* yyp; - char* yymsg; + int yyn; yyn = yypact[yystack->yytops.yystates[0]->yylrState]; - if (yyn > YYFLAG && yyn < YYLAST) + 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 ("parse 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) - if (yycheck[yyx + yyn] == yyx) - yysize += strlen (yytokenName (yyx)) + strlen (yyprefix), - yycount += 1, yyprefix = " or "; - yymsg = yyp = (char*) malloc (yysize); - yyp += sprintf (yyp, "parse error, unexpected %s", - yytokenName (*yytokenp)); - if (yycount < 5) - { - yyprefix = ", expecting "; - for (yyx = yyn < 0 ? -yyn : 0; yyx < yytname_size; yyx += 1) - if (yycheck[yyx + yyn] == yyx) + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += strlen (yyprefix) + strlen (yytokenName (yyx)); + yycount += 1; + if (yycount == 5) { - yyp += sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx)); - yyprefix = " or "; + yysize = 0; + break; } + yyprefix = " or "; + } + yysize += (sizeof ("syntax error, unexpected ") + + strlen (yytokenName (*yytokenp))); + yymsg = YYMALLOC (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); + YYFREE (yymsg); } - yyerror (yymsg); - free (yymsg); + else + yyerror (]b4_lyyerror_args["syntax error; also virtual memory exhausted"); } else -#endif - yyerror ("parse error"); +#endif /* YYERROR_VERBOSE */ + yyerror (]b4_lyyerror_args["syntax error"); yynerrs += 1; } } -/* Recover from a syntax error on STACK, assuming that TOKENP, +/* Recover from a syntax error on YYSTACK, assuming that YYTOKENP, YYLVALP, and YYLLOCP point to the syntactic category, semantic - value, and location of the lookahead. - NOTE: This uses the panic-mode recovery algorithm described in the - Bison documentation, which differs from what is in bison.simple. - Specifically, this routine performs no reductions before shifting - the error token. */ + value, and location of the lookahead. */ static void -yyrecoverParseError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp) +yyrecoverSyntaxError (yyGLRStack* yystack, + YYSTYPE* yylvalp, YYLTYPE* yyllocp]b4_user_formals[) { yySymbol* const yytokenp = yystack->yytokenp; size_t yyk; int yyj; - if (yystack->yyerrState == 0) - yystack->yyerrState = 3; - else if (yystack->yyerrState == 3) - { - /* We just shifted the error token and (perhaps) took some - reductions. Skip tokens until we can proceed. */ - do { + if (yystack->yyerrState == 3) + /* We just shifted the error token and (perhaps) took some + reductions. Skip tokens until we can proceed. */ + while (yytrue) + { if (*yytokenp == YYEOF) - yyFail (yystack, NULL); + { + /* Now pop stack until empty and fail. */ + while (yystack->yytops.yystates[0] != NULL) + { + yyGLRState *yys = yystack->yytops.yystates[0]; + YYDSYMPRINTF ("Error: popping", + yystos[yys->yylrState], + &yys->yysemantics.yysval, &yys->yyloc); + yydestruct (yystos[yys->yylrState], + &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[); + yystack->yytops.yystates[0] = yys->yypred; + yystack->yynextFree -= 1; + yystack->yyspaceLeft += 1; + } + yyFail (yystack][]b4_lpure_args[, NULL); + } if (*yytokenp != YYEMPTY) - YYDPRINTF ((stderr, "Discarding token %s\n", - yytokenName (*yytokenp))); + { + YYDSYMPRINTF ("Error: discarding", *yytokenp, yylvalp, yyllocp); + yydestruct (*yytokenp, yylvalp]b4_location_if([, yyllocp])[); + } + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; *yytokenp = YYTRANSLATE (yychar); - YYDPRINTF ((stderr, "Read token %s\n", yytokenName (*yytokenp))); + YYDSYMPRINTF ("Next token is", *yytokenp, yylvalp, yyllocp); yyj = yypact[yystack->yytops.yystates[0]->yylrState]; - if (yyj == YYFLAG) - /* Something's not right; we shouldn't be here */ - yyFail (yystack, NULL); + if (yyis_pact_ninf (yyj)) + return; yyj += *yytokenp; - if (yyj < 0 || yyj > YYLAST || yycheck[yyj] != *yytokenp) + if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != *yytokenp) { if (yydefact[yystack->yytops.yystates[0]->yylrState] != 0) return; } - else if (yytable[yyj] != 0 && yytable[yyj] != YYFLAG) + else if (yytable[yyj] != 0 && ! yyis_table_ninf (yytable[yyj])) return; - } while (yytrue); - } + } - /* Reduce to one stack */ + /* Reduce to one stack. */ for (yyk = 0; yyk < yystack->yytops.yysize; yyk += 1) if (yystack->yytops.yystates[yyk] != NULL) break; if (yyk >= yystack->yytops.yysize) - yyFail (yystack, NULL); + yyFail (yystack][]b4_lpure_args[, NULL); for (yyk += 1; yyk < yystack->yytops.yysize; yyk += 1) yymarkStackDeleted (yystack, yyk); yyremoveDeletes (yystack); yycompressStack (yystack); /* Now pop stack until we find a state that shifts the error token. */ + yystack->yyerrState = 3; while (yystack->yytops.yystates[0] != NULL) { - yyj = yypact[yystack->yytops.yystates[0]->yylrState] + YYTERROR; - if (yyj != YYFLAG + YYTERROR && yyj >= 0 && yyj <= YYLAST && - yycheck[yyj] == YYTERROR && yyisShiftAction (yytable[yyj])) + yyGLRState *yys = yystack->yytops.yystates[0]; + yyj = yypact[yys->yylrState]; + if (! yyis_pact_ninf (yyj)) { - yyglrShift (yystack, 0, yytable[yyj], - yystack->yytops.yystates[0]->yyposn, *yylvalp, yyllocp); - break; + yyj += YYTERROR; + if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR + && yyisShiftAction (yytable[yyj])) + { + YYDPRINTF ((stderr, "Shifting error token, ")); + yyglrShift (yystack, 0, yytable[yyj], + yys->yyposn, *yylvalp, yyllocp]b4_user_args[); + break; + } } - yystack->yytops.yystates[0] = yystack->yytops.yystates[0]->yypred; + YYDSYMPRINTF ("Error: popping", + yystos[yys->yylrState], + &yys->yysemantics.yysval, &yys->yyloc); + yydestruct (yystos[yys->yylrState], + &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[); + yystack->yytops.yystates[0] = yys->yypred; yystack->yynextFree -= 1; yystack->yyspaceLeft += 1; } if (yystack->yytops.yystates[0] == NULL) - yyFail (yystack, NULL); + yyFail (yystack][]b4_lpure_args[, NULL); } #define YYCHK1(YYE) \ @@ -1623,8 +1793,12 @@ yyrecoverParseError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp) } \ } while (0) -int -yyparse (YYPARSE_PARAM_ARG) + +/*----------. +| yyparse. | +`----------*/ + +]b4_c_ansi_function_def([yyparse], [int], b4_parse_param)[ { yySymbol yytoken; yyGLRStack yystack; @@ -1643,19 +1817,20 @@ yyparse (YYPARSE_PARAM_ARG) yyinitGLRStack (&yystack, YYINITDEPTH); yystack.yytokenp = &yytoken; + YYDPRINTF ((stderr, "Starting parse\n")); + if (setjmp (yystack.yyexception_buffer) != 0) goto yyDone; - yyglrShift (&yystack, 0, 0, 0, yyval_default, &yyloc_default); + yyglrShift (&yystack, 0, 0, 0, yyval_default, &yyloc_default]b4_user_args[); yytoken = YYEMPTY; yyposn = 0; while (yytrue) { - /* For efficiency, we have two loops, of which the first of which - * is specialized to deterministic operation (single stack, no - * potential ambiguity). */ - + /* For efficiency, we have two loops, the first of which is + specialized to deterministic operation (single stack, no + potential ambiguity). */ /* Standard mode */ while (yytrue) { @@ -1664,6 +1839,7 @@ yyparse (YYPARSE_PARAM_ARG) const short* yyconflicts; yyStateNum yystate = yystack.yytops.yystates[0]->yylrState; + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); if (yystate == YYFINAL) goto yyDone; if (yyisDefaultedState (yystate)) @@ -1671,43 +1847,42 @@ yyparse (YYPARSE_PARAM_ARG) yyrule = yydefaultAction (yystate); if (yyrule == 0) { - yyreportParseError (&yystack, yylvalp, yyllocp); + yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); goto yyuser_error; } - YYCHK1 (yyglrReduce (&yystack, 0, yyrule, yytrue)); + YYCHK1 (yyglrReduce (&yystack, 0, yyrule, yytrue]b4_lpure_args[)); } else { if (yytoken == YYEMPTY) { + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; yytoken = YYTRANSLATE (yychar); - YYDPRINTF ((stderr, "Read token %s\n", - yytokenName (yytoken))); + YYDSYMPRINTF ("Next token is", yytoken, yylvalp, yyllocp); } yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts); if (*yyconflicts != 0) break; if (yyisShiftAction (yyaction)) { - YYDPRINTF ((stderr, "Shifted token %s. ", + YYDPRINTF ((stderr, "Shifting token %s, ", yytokenName (yytoken))); if (yytoken != YYEOF) yytoken = YYEMPTY; yyposn += 1; - yyglrShift (&yystack, 0, yyaction, yyposn, yylval, yyllocp); - if (yystack.yyerrState > 0) + yyglrShift (&yystack, 0, yyaction, yyposn, + yylval, yyllocp]b4_user_args[); + if (0 < yystack.yyerrState) yystack.yyerrState -= 1; - YYDPRINTF ((stderr, "Now in state #%d\n", - yystack.yytops.yystates[0]->yylrState)); } else if (yyisErrorAction (yyaction)) { - yyreportParseError (&yystack, yylvalp, yyllocp); + yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); goto yyuser_error; } else - YYCHK1 (yyglrReduce (&yystack, 0, -yyaction, yytrue)); + YYCHK1 (yyglrReduce (&yystack, 0, -yyaction, yytrue]b4_lpure_args[)); } } @@ -1717,7 +1892,7 @@ yyparse (YYPARSE_PARAM_ARG) int yyn = yystack.yytops.yysize; for (yys = 0; yys < yyn; yys += 1) YYCHK1 (yyprocessOneStack (&yystack, yys, yyposn, - yylvalp, yyllocp)); + yylvalp, yyllocp]b4_user_args[)); yytoken = YYEMPTY; yyposn += 1; yyremoveDeletes (&yystack); @@ -1725,15 +1900,15 @@ yyparse (YYPARSE_PARAM_ARG) { yyundeleteLastStack (&yystack); if (yystack.yytops.yysize == 0) - yyFail (&yystack, "parse error"); - YYCHK1 (yyresolveStack (&yystack)); + yyFail (&yystack][]b4_lpure_args[, "syntax error"); + YYCHK1 (yyresolveStack (&yystack]b4_user_args[)); YYDPRINTF ((stderr, "Returning to deterministic operation.\n")); - yyreportParseError (&yystack, yylvalp, yyllocp); + yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); goto yyuser_error; } else if (yystack.yytops.yysize == 1) { - YYCHK1 (yyresolveStack (&yystack)); + YYCHK1 (yyresolveStack (&yystack]b4_user_args[)); YYDPRINTF ((stderr, "Returning to deterministic operation.\n")); yycompressStack (&yystack); break; @@ -1741,7 +1916,7 @@ yyparse (YYPARSE_PARAM_ARG) } continue; yyuser_error: - yyrecoverParseError (&yystack, yylvalp, yyllocp); + yyrecoverSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); yyposn = yystack.yytops.yystates[0]->yyposn; } yyDone: @@ -1756,20 +1931,19 @@ static void yypstack (yyGLRStack* yystack, int yyk) ATTRIBUTE_UNUSED; static void yypdumpstack (yyGLRStack* yystack) ATTRIBUTE_UNUSED; static void -yypstates (yyGLRState* yyst) +yy_yypstack (yyGLRState* yys) { - static void - yy_yypstack (yyGLRState* yys) + if (yys->yypred) { - if (yys->yypred == NULL) - fprintf (stderr, "%d@%d", yys->yylrState, yys->yyposn); - else - { - yy_yypstack (yys->yypred); - fprintf (stderr, " -> %d@%d", yys->yylrState, yys->yyposn); - } + yy_yypstack (yys->yypred); + fprintf (stderr, " -> "); } + fprintf (stderr, "%d@@%lu", yys->yylrState, (unsigned long) yys->yyposn); +} +static void +yypstates (yyGLRState* yyst) +{ if (yyst == NULL) fprintf (stderr, ""); else @@ -1783,7 +1957,7 @@ yypstack (yyGLRStack* yystack, int yyk) yypstates (yystack->yytops.yystates[yyk]); } -#define YYINDEX(YYX) \ +#define YYINDEX(YYX) \ ((YYX) == NULL ? -1 : (yyGLRStackItem*) (YYX) - yystack->yyitems) @@ -1794,69 +1968,72 @@ yypdumpstack (yyGLRStack* yystack) size_t yyi; for (yyp = yystack->yyitems; yyp < yystack->yynextFree; yyp += 1) { - fprintf (stderr, "%3d. ", yyp - yystack->yyitems); - if (*(bool*) yyp) + fprintf (stderr, "%3lu. ", (unsigned long) (yyp - yystack->yyitems)); + if (*(yybool *) yyp) { - fprintf (stderr, "Res: %d, LR State: %d, posn: %d, pred: %d", + fprintf (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld", yyp->yystate.yyresolved, yyp->yystate.yylrState, - yyp->yystate.yyposn, - YYINDEX(yyp->yystate.yypred)); + (unsigned long) yyp->yystate.yyposn, + (long) YYINDEX (yyp->yystate.yypred)); if (! yyp->yystate.yyresolved) - fprintf (stderr, ", firstVal: %d", - YYINDEX (yyp->yystate.yysemantics.yyfirstVal)); + fprintf (stderr, ", firstVal: %ld", + (long) YYINDEX (yyp->yystate.yysemantics.yyfirstVal)); } else { - fprintf (stderr, "Option. rule: %d, state: %d, next: %d", - yyp->yyoption.yyrule, YYINDEX (yyp->yyoption.yystate), - YYINDEX (yyp->yyoption.yynext)); + fprintf (stderr, "Option. rule: %d, state: %ld, next: %ld", + yyp->yyoption.yyrule, + (long) YYINDEX (yyp->yyoption.yystate), + (long) YYINDEX (yyp->yyoption.yynext)); } fprintf (stderr, "\n"); } fprintf (stderr, "Tops:"); for (yyi = 0; yyi < yystack->yytops.yysize; yyi += 1) - fprintf (stderr, "%d: %d; ", yyi, YYINDEX (yystack->yytops.yystates[yyi])); + fprintf (stderr, "%lu: %ld; ", (unsigned long) yyi, + (long) YYINDEX (yystack->yytops.yystates[yyi])); fprintf (stderr, "\n"); } - ] b4_epilogue m4_if(b4_defines_flag, 0, [], -[#output "b4_output_header_name" -b4_copyright([Skeleton parser for GLR parsing with Bison], [2002]) -#ifndef b4_header_guard -# define b4_header_guard +[@output @output_header_name@ +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], -[#line b4_stype_line "b4_filename" -typedef union b4_stype yystype; -/* Line __line__ of __file__. */ -#line __oline__ "__ofile__"], -[typedef int yystype;]) -# define YYSTYPE yystype +[b4_syncline([b4_stype_line], [b4_filename]) +typedef union m4_bregexp(b4_stype, [^{], [YYSTYPE ])b4_stype YYSTYPE; +/* Line __line__ of glr.c. */ +b4_syncline([@oline@], [@ofile@])], +[typedef int YYSTYPE;]) +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 #endif 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 yyfirst_line; - int yyfirst_column; - int yylast_line; - int yylast_column; -} yyltype; -# define YYLTYPE yyltype +b4_location_if([ + int first_line; + int first_column; + int last_line; + int last_column; +],[ + char yydummy; +]) +} YYLTYPE; +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 #endif -m4_if(b4_pure, [0], +b4_location_if([m4_if(b4_pure, [0], [extern YYLTYPE b4_prefix[]lloc;]) ]) -#endif /* not b4_header_guard */ ])