X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/584bbcd83924988a4d5c16bb5045391fc210cfad..e62f1a899168bdf1658dd6d934dea407491a80ff:/src/parse-gram.c?ds=sidebyside diff --git a/src/parse-gram.c b/src/parse-gram.c index 2170ea23..19a0252d 100644 --- a/src/parse-gram.c +++ b/src/parse-gram.c @@ -1,4 +1,4 @@ -/* A Bison parser, made by GNU Bison 1.875c. */ +/* A Bison parser, made by GNU Bison 2.0a. */ /* Skeleton parser for Yacc-like parsing with Bison, Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. @@ -45,8 +45,7 @@ /* Using locations. */ #define YYLSP_NEEDED 1 -/* If NAME_PREFIX is specified substitute the variables and functions - names. */ +/* Substitute the variable and function names. */ #define yyparse gram_parse #define yylex gram_lex #define yyerror gram_error @@ -167,7 +166,28 @@ /* Copy the first part of user declarations. */ -#line 32 "parse-gram.y" +#line 1 "parse-gram.y" +/* Bison Grammar Parser -*- C -*- + + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + 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 +*/ #include "system.h" @@ -184,6 +204,9 @@ #define YYLLOC_DEFAULT(Current, Rhs, N) (Current) = lloc_default (Rhs, N) static YYLTYPE lloc_default (YYLTYPE const *, int); +#define YY_LOCATION_PRINT(File, Loc) \ + location_print (File, Loc) + /* Request detailed syntax error messages, and pass them to GRAM_ERROR. FIXME: depends on the undocumented availability of YYLLOC. */ #undef yyerror @@ -219,7 +242,7 @@ int current_prec = 0; #endif #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 80 "parse-gram.y" +#line 81 "parse-gram.y" typedef union YYSTYPE { symbol *symbol; symbol_list *list; @@ -229,7 +252,7 @@ typedef union YYSTYPE { uniqstr uniqstr; } YYSTYPE; /* Line 191 of yacc.c. */ -#line 233 "parse-gram.c" +#line 256 "parse-gram.c" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 @@ -253,7 +276,7 @@ typedef struct YYLTYPE /* Line 214 of yacc.c. */ -#line 257 "parse-gram.c" +#line 280 "parse-gram.c" #if ! defined (yyoverflow) || YYERROR_VERBOSE @@ -268,14 +291,10 @@ typedef struct YYLTYPE # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA -# define YYSTACK_ALLOC alloca -# endif -# else -# if defined (alloca) || defined (_ALLOCA_H) -# define YYSTACK_ALLOC alloca -# else # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca +# else +# define YYSTACK_ALLOC alloca # endif # endif # endif @@ -326,7 +345,7 @@ union yyalloc # define YYCOPY(To, From, Count) \ do \ { \ - register YYSIZE_T yyi; \ + YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ @@ -459,14 +478,14 @@ static const yysigned_char yyrhs[] = /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short int yyrline[] = { - 0, 173, 173, 181, 183, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 201, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 221, - 222, 223, 227, 233, 240, 247, 251, 258, 258, 263, - 263, 268, 278, 293, 294, 295, 299, 300, 306, 307, - 312, 316, 321, 327, 333, 344, 345, 354, 355, 361, - 362, 367, 374, 374, 378, 379, 380, 385, 386, 388, - 390, 392, 394, 399, 400, 404, 410, 419, 426, 428 + 0, 174, 174, 182, 184, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 202, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 222, + 223, 224, 228, 234, 241, 248, 252, 259, 259, 264, + 264, 269, 279, 294, 295, 296, 300, 301, 307, 308, + 313, 317, 322, 328, 334, 345, 346, 355, 356, 362, + 363, 368, 375, 375, 379, 380, 381, 386, 387, 389, + 391, 393, 395, 400, 401, 405, 411, 420, 427, 429 }; #endif @@ -701,20 +720,53 @@ do \ } \ while (0) + #define YYTERROR 1 #define YYERRCODE 256 -/* 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). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - ((Current).first_line = (Rhs)[1].first_line, \ - (Current).first_column = (Rhs)[1].first_column, \ - (Current).last_line = (Rhs)[N].last_line, \ - (Current).last_column = (Rhs)[N].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) +#endif + + +/* 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. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif #endif + /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM @@ -737,19 +789,13 @@ do { \ YYFPRINTF Args; \ } while (0) -# define YYDSYMPRINT(Args) \ -do { \ - if (yydebug) \ - yysymprint Args; \ -} while (0) - -# define YYDSYMPRINTF(Title, Token, Value, Location) \ +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yysymprint (stderr, \ - Token, Value, Location); \ + Type, Value, Location); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) @@ -816,8 +862,7 @@ do { \ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) -# define YYDSYMPRINT(Args) -# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ @@ -835,10 +880,6 @@ int yydebug; SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ -#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 -# undef YYMAXDEPTH -#endif - #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif @@ -860,7 +901,7 @@ yystrlen (yystr) const char *yystr; # endif { - register const char *yys = yystr; + const char *yys = yystr; while (*yys++ != '\0') continue; @@ -885,8 +926,8 @@ yystpcpy (yydest, yysrc) const char *yysrc; # endif { - register char *yyd = yydest; - register const char *yys = yysrc; + char *yyd = yydest; + const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; @@ -922,15 +963,17 @@ yysymprint (yyoutput, yytype, yyvaluep, yylocationp) (void) yylocationp; if (yytype < YYNTOKENS) - { - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); -# ifdef YYPRINT - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# endif - } + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + YY_LOCATION_PRINT (yyoutput, *yylocationp); + fprintf (yyoutput, ": "); + +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif switch (yytype) { default: @@ -946,10 +989,11 @@ yysymprint (yyoutput, yytype, yyvaluep, yylocationp) #if defined (__STDC__) || defined (__cplusplus) static void -yydestruct (int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp) +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp) #else static void -yydestruct (yytype, yyvaluep, yylocationp) +yydestruct (yymsg, yytype, yyvaluep, yylocationp) + const char *yymsg; int yytype; YYSTYPE *yyvaluep; YYLTYPE *yylocationp; @@ -959,6 +1003,10 @@ yydestruct (yytype, yyvaluep, yylocationp) (void) yyvaluep; (void) yylocationp; + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + switch (yytype) { @@ -1011,23 +1059,23 @@ yyparse () #endif #endif { - /* The lookahead symbol. */ + /* The look-ahead symbol. */ int yychar; -/* The semantic value of the lookahead symbol. */ +/* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; -/* Location data for the lookahead symbol. */ +/* Location data for the look-ahead symbol. */ YYLTYPE yylloc; - register int yystate; - register int yyn; + int yystate; + int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; - /* Lookahead token as an internal (translated) token number. */ + /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; /* Three stacks and their tools: @@ -1041,18 +1089,19 @@ YYLTYPE yylloc; /* The state stack. */ short int yyssa[YYINITDEPTH]; short int *yyss = yyssa; - register short int *yyssp; + short int *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; - register YYSTYPE *yyvsp; + YYSTYPE *yyvsp; /* The location stack. */ YYLTYPE yylsa[YYINITDEPTH]; YYLTYPE *yyls = yylsa; YYLTYPE *yylsp; - YYLTYPE *yylerrsp; + /* The locations where the error started and ended. */ + YYLTYPE yyerror_range[2]; #define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) @@ -1082,18 +1131,27 @@ YYLTYPE yylloc; yyssp = yyss; yyvsp = yyvs; yylsp = yyls; +#if YYLTYPE_IS_TRIVIAL + /* Initialize the default location before parsing starts. */ + yylloc.first_line = yylloc.last_line = 1; + yylloc.first_column = yylloc.last_column = 0; +#endif + /* User initialization code. */ - #line 70 "parse-gram.y" + #line 71 "parse-gram.y" { /* Bison's grammar can initial empty locations, hence a default location is needed. */ - (*yylsp).start.file = (*yylsp).end.file = current_file; - (*yylsp).start.line = (*yylsp).end.line = 1; - (*yylsp).start.column = (*yylsp).end.column = 0; + yylloc.start.file = yylloc.end.file = current_file; + yylloc.start.line = yylloc.end.line = 1; + yylloc.start.column = yylloc.end.column = 0; } -/* Line 818 of yacc.c. */ -#line 1097 "parse-gram.c" +/* Line 843 of yacc.c. */ +#line 1152 "parse-gram.c" + yyvsp[0] = yylval; + yylsp[0] = yylloc; + goto yysetstate; /*------------------------------------------------------------. @@ -1183,18 +1241,18 @@ YYLTYPE yylloc; yybackup: /* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ +/* Read a look-ahead token if we need one and don't already have one. */ /* yyresume: */ - /* First try to decide what to do without reference to lookahead token. */ + /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; - /* Not known => get a lookahead token if don't already have one. */ + /* Not known => get a look-ahead token if don't already have one. */ - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); @@ -1209,7 +1267,7 @@ yybackup: else { yytoken = YYTRANSLATE (yychar); - YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to @@ -1229,8 +1287,8 @@ yybackup: if (yyn == YYFINAL) YYACCEPT; - /* Shift the lookahead token. */ - YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) @@ -1281,47 +1339,47 @@ yyreduce: switch (yyn) { case 6: -#line 188 "parse-gram.y" - { prologue_augment (yyvsp[0].chars, yylsp[0]); } +#line 189 "parse-gram.y" + { prologue_augment ((yyvsp[0].chars), (yylsp[0])); } break; case 7: -#line 189 "parse-gram.y" +#line 190 "parse-gram.y" { debug_flag = true; } break; case 8: -#line 190 "parse-gram.y" - { muscle_insert (yyvsp[-1].chars, yyvsp[0].chars); } +#line 191 "parse-gram.y" + { muscle_insert ((yyvsp[-1].chars), (yyvsp[0].chars)); } break; case 9: -#line 191 "parse-gram.y" +#line 192 "parse-gram.y" { defines_flag = true; } break; case 10: -#line 192 "parse-gram.y" +#line 193 "parse-gram.y" { error_verbose = true; } break; case 11: -#line 193 "parse-gram.y" - { expected_sr_conflicts = yyvsp[0].integer; } +#line 194 "parse-gram.y" + { expected_sr_conflicts = (yyvsp[0].integer); } break; case 12: -#line 194 "parse-gram.y" - { expected_rr_conflicts = yyvsp[0].integer; } +#line 195 "parse-gram.y" + { expected_rr_conflicts = (yyvsp[0].integer); } break; case 13: -#line 195 "parse-gram.y" - { spec_file_prefix = yyvsp[0].chars; } +#line 196 "parse-gram.y" + { spec_file_prefix = (yyvsp[0].chars); } break; case 14: -#line 197 "parse-gram.y" +#line 198 "parse-gram.y" { nondeterministic_parser = true; glr_parser = true; @@ -1329,129 +1387,129 @@ yyreduce: break; case 15: -#line 202 "parse-gram.y" +#line 203 "parse-gram.y" { - muscle_code_grow ("initial_action", yyvsp[0].chars, yylsp[0]); + muscle_code_grow ("initial_action", (yyvsp[0].chars), (yylsp[0])); } break; case 16: -#line 205 "parse-gram.y" - { add_param ("lex_param", yyvsp[0].chars, yylsp[0]); } +#line 206 "parse-gram.y" + { add_param ("lex_param", (yyvsp[0].chars), (yylsp[0])); } break; case 17: -#line 206 "parse-gram.y" +#line 207 "parse-gram.y" { locations_flag = true; } break; case 18: -#line 207 "parse-gram.y" - { spec_name_prefix = yyvsp[0].chars; } +#line 208 "parse-gram.y" + { spec_name_prefix = (yyvsp[0].chars); } break; case 19: -#line 208 "parse-gram.y" +#line 209 "parse-gram.y" { no_lines_flag = true; } break; case 20: -#line 209 "parse-gram.y" +#line 210 "parse-gram.y" { nondeterministic_parser = true; } break; case 21: -#line 210 "parse-gram.y" - { spec_outfile = yyvsp[0].chars; } +#line 211 "parse-gram.y" + { spec_outfile = (yyvsp[0].chars); } break; case 22: -#line 211 "parse-gram.y" - { add_param ("parse_param", yyvsp[0].chars, yylsp[0]); } +#line 212 "parse-gram.y" + { add_param ("parse_param", (yyvsp[0].chars), (yylsp[0])); } break; case 23: -#line 212 "parse-gram.y" +#line 213 "parse-gram.y" { pure_parser = true; } break; case 24: -#line 213 "parse-gram.y" - { skeleton = yyvsp[0].chars; } +#line 214 "parse-gram.y" + { skeleton = (yyvsp[0].chars); } break; case 25: -#line 214 "parse-gram.y" +#line 215 "parse-gram.y" { token_table_flag = true; } break; case 26: -#line 215 "parse-gram.y" +#line 216 "parse-gram.y" { report_flag = report_states; } break; case 27: -#line 216 "parse-gram.y" +#line 217 "parse-gram.y" { yacc_flag = true; } break; case 31: -#line 224 "parse-gram.y" +#line 225 "parse-gram.y" { - grammar_start_symbol_set (yyvsp[0].symbol, yylsp[0]); + grammar_start_symbol_set ((yyvsp[0].symbol), (yylsp[0])); } break; case 32: -#line 228 "parse-gram.y" +#line 229 "parse-gram.y" { typed = true; - MUSCLE_INSERT_INT ("stype_line", yylsp[0].start.line); - muscle_insert ("stype", yyvsp[0].chars); + MUSCLE_INSERT_INT ("stype_line", (yylsp[0]).start.line); + muscle_insert ("stype", (yyvsp[0].chars)); } break; case 33: -#line 234 "parse-gram.y" +#line 235 "parse-gram.y" { symbol_list *list; - for (list = yyvsp[0].list; list; list = list->next) - symbol_destructor_set (list->sym, yyvsp[-1].chars, yylsp[-1]); - symbol_list_free (yyvsp[0].list); + for (list = (yyvsp[0].list); list; list = list->next) + symbol_destructor_set (list->sym, (yyvsp[-1].chars), (yylsp[-1])); + symbol_list_free ((yyvsp[0].list)); } break; case 34: -#line 241 "parse-gram.y" +#line 242 "parse-gram.y" { symbol_list *list; - for (list = yyvsp[0].list; list; list = list->next) - symbol_printer_set (list->sym, yyvsp[-1].chars, list->location); - symbol_list_free (yyvsp[0].list); + for (list = (yyvsp[0].list); list; list = list->next) + symbol_printer_set (list->sym, (yyvsp[-1].chars), list->location); + symbol_list_free ((yyvsp[0].list)); } break; case 35: -#line 248 "parse-gram.y" +#line 249 "parse-gram.y" { default_prec = true; } break; case 36: -#line 252 "parse-gram.y" +#line 253 "parse-gram.y" { default_prec = false; } break; case 37: -#line 258 "parse-gram.y" +#line 259 "parse-gram.y" { current_class = nterm_sym; } break; case 38: -#line 259 "parse-gram.y" +#line 260 "parse-gram.y" { current_class = unknown_sym; current_type = NULL; @@ -1459,12 +1517,12 @@ yyreduce: break; case 39: -#line 263 "parse-gram.y" +#line 264 "parse-gram.y" { current_class = token_sym; } break; case 40: -#line 264 "parse-gram.y" +#line 265 "parse-gram.y" { current_class = unknown_sym; current_type = NULL; @@ -1472,212 +1530,213 @@ yyreduce: break; case 41: -#line 269 "parse-gram.y" +#line 270 "parse-gram.y" { symbol_list *list; - for (list = yyvsp[0].list; list; list = list->next) - symbol_type_set (list->sym, yyvsp[-1].uniqstr, yylsp[-1]); - symbol_list_free (yyvsp[0].list); + for (list = (yyvsp[0].list); list; list = list->next) + symbol_type_set (list->sym, (yyvsp[-1].uniqstr), (yylsp[-1])); + symbol_list_free ((yyvsp[0].list)); } break; case 42: -#line 279 "parse-gram.y" +#line 280 "parse-gram.y" { symbol_list *list; ++current_prec; - for (list = yyvsp[0].list; list; list = list->next) + for (list = (yyvsp[0].list); list; list = list->next) { - symbol_type_set (list->sym, current_type, yylsp[-1]); - symbol_precedence_set (list->sym, current_prec, yyvsp[-2].assoc, yylsp[-2]); + symbol_type_set (list->sym, current_type, (yylsp[-1])); + symbol_precedence_set (list->sym, current_prec, (yyvsp[-2].assoc), (yylsp[-2])); } - symbol_list_free (yyvsp[0].list); + symbol_list_free ((yyvsp[0].list)); current_type = NULL; } break; case 43: -#line 293 "parse-gram.y" - { yyval.assoc = left_assoc; } +#line 294 "parse-gram.y" + { (yyval.assoc) = left_assoc; } break; case 44: -#line 294 "parse-gram.y" - { yyval.assoc = right_assoc; } +#line 295 "parse-gram.y" + { (yyval.assoc) = right_assoc; } break; case 45: -#line 295 "parse-gram.y" - { yyval.assoc = non_assoc; } +#line 296 "parse-gram.y" + { (yyval.assoc) = non_assoc; } break; case 46: -#line 299 "parse-gram.y" +#line 300 "parse-gram.y" { current_type = NULL; } break; case 47: -#line 300 "parse-gram.y" - { current_type = yyvsp[0].uniqstr; } +#line 301 "parse-gram.y" + { current_type = (yyvsp[0].uniqstr); } break; case 48: -#line 306 "parse-gram.y" - { yyval.list = symbol_list_new (yyvsp[0].symbol, yylsp[0]); } +#line 307 "parse-gram.y" + { (yyval.list) = symbol_list_new ((yyvsp[0].symbol), (yylsp[0])); } break; case 49: -#line 307 "parse-gram.y" - { yyval.list = symbol_list_prepend (yyvsp[-1].list, yyvsp[0].symbol, yylsp[0]); } +#line 308 "parse-gram.y" + { (yyval.list) = symbol_list_prepend ((yyvsp[-1].list), (yyvsp[0].symbol), (yylsp[0])); } break; case 50: -#line 313 "parse-gram.y" +#line 314 "parse-gram.y" { - current_type = yyvsp[0].uniqstr; + current_type = (yyvsp[0].uniqstr); } break; case 51: -#line 317 "parse-gram.y" +#line 318 "parse-gram.y" { - symbol_class_set (yyvsp[0].symbol, current_class, yylsp[0]); - symbol_type_set (yyvsp[0].symbol, current_type, yylsp[0]); + symbol_class_set ((yyvsp[0].symbol), current_class, (yylsp[0])); + symbol_type_set ((yyvsp[0].symbol), current_type, (yylsp[0])); } break; case 52: -#line 322 "parse-gram.y" +#line 323 "parse-gram.y" { - symbol_class_set (yyvsp[-1].symbol, current_class, yylsp[-1]); - symbol_type_set (yyvsp[-1].symbol, current_type, yylsp[-1]); - symbol_user_token_number_set (yyvsp[-1].symbol, yyvsp[0].integer, yylsp[0]); + symbol_class_set ((yyvsp[-1].symbol), current_class, (yylsp[-1])); + symbol_type_set ((yyvsp[-1].symbol), current_type, (yylsp[-1])); + symbol_user_token_number_set ((yyvsp[-1].symbol), (yyvsp[0].integer), (yylsp[0])); } break; case 53: -#line 328 "parse-gram.y" +#line 329 "parse-gram.y" { - symbol_class_set (yyvsp[-1].symbol, current_class, yylsp[-1]); - symbol_type_set (yyvsp[-1].symbol, current_type, yylsp[-1]); - symbol_make_alias (yyvsp[-1].symbol, yyvsp[0].symbol, yyloc); + symbol_class_set ((yyvsp[-1].symbol), current_class, (yylsp[-1])); + symbol_type_set ((yyvsp[-1].symbol), current_type, (yylsp[-1])); + symbol_make_alias ((yyvsp[-1].symbol), (yyvsp[0].symbol), (yyloc)); } break; case 54: -#line 334 "parse-gram.y" +#line 335 "parse-gram.y" { - symbol_class_set (yyvsp[-2].symbol, current_class, yylsp[-2]); - symbol_type_set (yyvsp[-2].symbol, current_type, yylsp[-2]); - symbol_user_token_number_set (yyvsp[-2].symbol, yyvsp[-1].integer, yylsp[-1]); - symbol_make_alias (yyvsp[-2].symbol, yyvsp[0].symbol, yyloc); + symbol_class_set ((yyvsp[-2].symbol), current_class, (yylsp[-2])); + symbol_type_set ((yyvsp[-2].symbol), current_type, (yylsp[-2])); + symbol_user_token_number_set ((yyvsp[-2].symbol), (yyvsp[-1].integer), (yylsp[-1])); + symbol_make_alias ((yyvsp[-2].symbol), (yyvsp[0].symbol), (yyloc)); } break; case 60: -#line 363 "parse-gram.y" +#line 364 "parse-gram.y" { if (yacc_flag) - complain_at (yyloc, _("POSIX forbids declarations in the grammar")); + complain_at ((yyloc), _("POSIX forbids declarations in the grammar")); } break; case 61: -#line 368 "parse-gram.y" +#line 369 "parse-gram.y" { yyerrok; } break; case 62: -#line 374 "parse-gram.y" - { current_lhs = yyvsp[0].symbol; current_lhs_location = yylsp[0]; } +#line 375 "parse-gram.y" + { current_lhs = (yyvsp[0].symbol); current_lhs_location = (yylsp[0]); } break; case 64: -#line 378 "parse-gram.y" - { grammar_rule_end (yylsp[0]); } +#line 379 "parse-gram.y" + { grammar_rule_end ((yylsp[0])); } break; case 65: -#line 379 "parse-gram.y" - { grammar_rule_end (yylsp[0]); } +#line 380 "parse-gram.y" + { grammar_rule_end ((yylsp[0])); } break; case 67: -#line 385 "parse-gram.y" +#line 386 "parse-gram.y" { grammar_rule_begin (current_lhs, current_lhs_location); } break; case 68: -#line 387 "parse-gram.y" - { grammar_current_rule_symbol_append (yyvsp[0].symbol, yylsp[0]); } +#line 388 "parse-gram.y" + { grammar_current_rule_symbol_append ((yyvsp[0].symbol), (yylsp[0])); } break; case 69: -#line 389 "parse-gram.y" - { grammar_current_rule_action_append (yyvsp[0].chars, yylsp[0]); } +#line 390 "parse-gram.y" + { grammar_current_rule_action_append ((yyvsp[0].chars), (yylsp[0])); } break; case 70: -#line 391 "parse-gram.y" - { grammar_current_rule_prec_set (yyvsp[0].symbol, yylsp[0]); } +#line 392 "parse-gram.y" + { grammar_current_rule_prec_set ((yyvsp[0].symbol), (yylsp[0])); } break; case 71: -#line 393 "parse-gram.y" - { grammar_current_rule_dprec_set (yyvsp[0].integer, yylsp[0]); } +#line 394 "parse-gram.y" + { grammar_current_rule_dprec_set ((yyvsp[0].integer), (yylsp[0])); } break; case 72: -#line 395 "parse-gram.y" - { grammar_current_rule_merge_set (yyvsp[0].uniqstr, yylsp[0]); } +#line 396 "parse-gram.y" + { grammar_current_rule_merge_set ((yyvsp[0].uniqstr), (yylsp[0])); } break; case 73: -#line 399 "parse-gram.y" - { yyval.symbol = yyvsp[0].symbol; } +#line 400 "parse-gram.y" + { (yyval.symbol) = (yyvsp[0].symbol); } break; case 74: -#line 400 "parse-gram.y" - { yyval.symbol = yyvsp[0].symbol; } +#line 401 "parse-gram.y" + { (yyval.symbol) = (yyvsp[0].symbol); } break; case 75: -#line 405 "parse-gram.y" - { yyval.chars = yyvsp[0].chars; } +#line 406 "parse-gram.y" + { (yyval.chars) = (yyvsp[0].chars); } break; case 76: -#line 411 "parse-gram.y" +#line 412 "parse-gram.y" { - yyval.symbol = symbol_get (yyvsp[0].chars, yylsp[0]); - symbol_class_set (yyval.symbol, token_sym, yylsp[0]); + (yyval.symbol) = symbol_get ((yyvsp[0].chars), (yylsp[0])); + symbol_class_set ((yyval.symbol), token_sym, (yylsp[0])); } break; case 77: -#line 420 "parse-gram.y" +#line 421 "parse-gram.y" { - yyval.chars = yyvsp[0].chars + 1; - yyval.chars[strlen (yyval.chars) - 1] = '\0'; + (yyval.chars) = (yyvsp[0].chars) + 1; + (yyval.chars)[strlen ((yyval.chars)) - 1] = '\0'; } break; case 79: -#line 429 "parse-gram.y" +#line 430 "parse-gram.y" { - muscle_code_grow ("epilogue", yyvsp[0].chars, yylsp[0]); + muscle_code_grow ("epilogue", (yyvsp[0].chars), (yylsp[0])); scanner_last_string_free (); } break; + default: break; } -/* Line 1010 of yacc.c. */ -#line 1681 "parse-gram.c" +/* Line 1039 of yacc.c. */ +#line 1740 "parse-gram.c" yyvsp -= yylen; yyssp -= yylen; @@ -1773,11 +1832,11 @@ yyerrlab: yyerror ("syntax error"); } - yylerrsp = yylsp; + yyerror_range[0] = yylloc; if (yyerrstatus == 3) { - /* If just tried and failed to reuse lookahead token after an + /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) @@ -1787,23 +1846,22 @@ yyerrlab: if (yychar == YYEOF) for (;;) { + yyerror_range[0] = *yylsp; YYPOPSTACK; if (yyssp == yyss) YYABORT; - YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); - yydestruct (yystos[*yyssp], yyvsp, yylsp); + yydestruct ("Error: popping", + yystos[*yyssp], yyvsp, yylsp); } } else { - YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); - yydestruct (yytoken, &yylval, &yylloc); + yydestruct ("Error: discarding", yytoken, &yylval, &yylloc); yychar = YYEMPTY; - *++yylerrsp = yylloc; } } - /* Else will try to reuse lookahead token after shifting the error + /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; @@ -1813,19 +1871,17 @@ yyerrlab: `---------------------------------------------------*/ yyerrorlab: -#ifdef __GNUC__ - /* Pacify GCC when the user code never invokes YYERROR and the label - yyerrorlab therefore never appears in user code. */ + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ if (0) goto yyerrorlab; -#endif + yyerror_range[0] = yylsp[1-yylen]; + yylsp -= yylen; yyvsp -= yylen; yyssp -= yylen; yystate = *yyssp; - yylerrsp = yylsp; - *++yylerrsp = yyloc; - yylsp -= yylen; goto yyerrlab1; @@ -1853,8 +1909,8 @@ yyerrlab1: if (yyssp == yyss) YYABORT; - YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); - yydestruct (yystos[yystate], yyvsp, yylsp); + yyerror_range[0] = *yylsp; + yydestruct ("Error: popping", yystos[yystate], yyvsp, yylsp); YYPOPSTACK; yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); @@ -1863,12 +1919,17 @@ yyerrlab1: if (yyn == YYFINAL) YYACCEPT; - YYDPRINTF ((stderr, "Shifting error token, ")); - *++yyvsp = yylval; - YYLLOC_DEFAULT (yyloc, yylsp, yylerrsp - yylsp); + + yyerror_range[1] = yylloc; + /* Using YYLLOC is tempting, but would change the location of + the look-ahead. YYLOC is available though. */ + YYLLOC_DEFAULT (yyloc, yyerror_range - 1, 2); *++yylsp = yyloc; + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + yystate = yyn; goto yynewstate; @@ -1884,6 +1945,9 @@ yyacceptlab: | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: + yydestruct ("Error: discarding lookahead", + yytoken, &yylval, &yylloc); + yychar = YYEMPTY; yyresult = 1; goto yyreturn; @@ -1906,7 +1970,7 @@ yyreturn: } -#line 435 "parse-gram.y" +#line 436 "parse-gram.y" @@ -1920,7 +1984,11 @@ lloc_default (YYLTYPE const *rhs, int n) { int i; YYLTYPE loc; - loc.start = loc.end = rhs[n].end; + + /* SGI MIPSpro 7.4.1m miscompiles "loc.start = loc.end = rhs[n].end;". + The bug is fixed in 7.4.2m, but play it safe for now. */ + loc.start = rhs[n].end; + loc.end = rhs[n].end; /* Ignore empty nonterminals the start of the the right-hand side. Do not bother to ignore them at the end of the right-hand side, @@ -1942,22 +2010,28 @@ lloc_default (YYLTYPE const *rhs, int n) static void add_param (char const *type, char *decl, location loc) { - static char const alphanum[] = - "0123456789" + static char const alphanum[26 + 26 + 1 + 10] = "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "_"; - char const *alpha = alphanum + 10; + "_" + "0123456789"; char const *name_start = NULL; char *p; - for (p = decl; *p; p++) - if ((p == decl || ! strchr (alphanum, p[-1])) && strchr (alpha, p[0])) + /* Stop on last actual character. */ + for (p = decl; p[1]; p++) + if ((p == decl + || ! memchr (alphanum, p[-1], sizeof alphanum)) + && memchr (alphanum, p[0], sizeof alphanum - 10)) name_start = p; - /* Strip the surrounding '{' and '}'. */ - decl++; - p[-1] = '\0'; + /* Strip the surrounding '{' and '}', and any blanks just inside + the braces. */ + while (*--p == ' ' || *p == '\t') + continue; + p[1] = '\0'; + while (*++decl == ' ' || *decl == '\t') + continue; if (! name_start) complain_at (loc, _("missing identifier in parameter declaration")); @@ -1967,7 +2041,7 @@ add_param (char const *type, char *decl, location loc) size_t name_len; for (name_len = 1; - name_start[name_len] && strchr (alphanum, name_start[name_len]); + memchr (alphanum, name_start[name_len], sizeof alphanum); name_len++) continue;