From: Akim Demaille Date: Fri, 14 Dec 2012 12:56:11 +0000 (+0100) Subject: Merge branch 'origin/maint' X-Git-Tag: v2.7.90~257 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/b9278c7d174c1be5d7482343c5e433f428657ed0?ds=inline;hp=-c Merge branch 'origin/maint' * origin/maint: maint: credit Wojciech Polak maint: post-release administrivia version 2.7 yacc.c: scope reduction tests: C90 compliance fix C90 compliance glr.c: scope reduction gnulib: update Conflicts: NEWS gnulib src/scan-gram.l src/system.h --- b9278c7d174c1be5d7482343c5e433f428657ed0 diff --combined NEWS index 7df5d87e,8da9cf9f..39c812e0 --- a/NEWS +++ b/NEWS @@@ -2,255 -2,15 +2,252 @@@ GNU Bison NEW * Noteworthy changes in release ?.? (????-??-??) [?] +** Incompatible changes + +*** Obsolete features + + Support for YYFAIL is removed (deprecated in Bison 2.4.2). + Support for yystype and yyltype (instead of YYSTYPE and YYLTYPE) + is removed (deprecated in Bison 1.875). + Support for YYPARSE_PARAM is removed (deprecated in Bison 1.875). + +** Warnings + +*** Enhancements of the -Werror option + + The -Werror=CATEGORY option is now recognized, and will treat specified + warnings as errors. The warnings need not have been explicitly activated + using the -W option, this is similar to what GCC 4.7 does. + + For example, given the following command line, Bison will treat both + warnings related to POSIX Yacc incompatibilities and S/R conflicts as + errors (and only those): + + $ bison -Werror=yacc,error=conflicts-sr input.y + + If no categories are specified, -Werror will make all active warnings into + errors. For example, the following line does the same the previous example: + + $ bison -Werror -Wnone -Wyacc -Wconflicts-sr input.y + + (By default -Wconflicts-sr,conflicts-rr,deprecated,other is enabled.) + + Note that the categories in this -Werror option may not be prefixed with + "no-". However, -Wno-error[=CATEGORY] is valid. + + Note that -y enables -Werror=yacc. Therefore it is now possible to require + Yacc-like behavior (e.g., always generate y.tab.c), but to report + incompatibilities as warnings: "-y -Wno-error=yacc". + +*** The display of warnings is now richer + + The option that controls a given warning is now displayed: + + foo.y:4.6: warning: type clash on default action: != [-Wother] + + In the case of warnings treated as errors, the prefix is changed from + "warning: " to "error: ", and the suffix is displayed, in a manner similar + to GCC, as [-Werror=CATEGORY]. + + For instance, where the previous version of Bison would report (and exit + with failure): + + bison: warnings being treated as errors + input.y:1.1: warning: stray ',' treated as white space + + it now reports: + + input.y:1.1: error: stray ',' treated as white space [-Werror=other] + +*** Deprecated constructs + + The new 'deprecated' warning category flags obsolete constructs whose + support will be discontinued. It is enabled by default. These warnings + used to be reported as 'other' warnings. + +*** Useless semantic types + + Bison now warns about useless (uninhabited) semantic types. Since + semantic types are not declared to Bison (they are defined in the opaque + %union structure), it is %printer/%destructor directives about useless + types that trigger the warning: + + %token term + %type nterm + %printer {} + %destructor {} + %% + nterm: term { $$ = $1; }; + + 3.28-34: warning: type is used, but is not associated to any symbol + 4.28-34: warning: type is used, but is not associated to any symbol + +*** Undefined but unused symbols + + Bison used to raise an error for undefined symbols that are not used in + the grammar. This is now only a warning. + + %printer {} symbol1 + %destructor {} symbol2 + %type symbol3 + %% + exp: "a"; + +*** Useless destructors or printers + + Bison now warns about useless destructors or printers. In the following + example, the printer for , and the destructor for are + useless: all symbols of (token1) already have a printer, and all + symbols of type (token2) already have a destructor. + + %token token1 + token2 + token3 + token4 + %printer {} token1 + %destructor {} token2 + +*** Conflicts + + The warnings and error messages about shift/reduce and reduce/reduce + conflicts have been normalized. For instance on the following foo.y file: + + %glr-parser + %% + exp: exp '+' exp | '0' | '0'; + + compare the previous version of bison: + + $ bison foo.y + foo.y: conflicts: 1 shift/reduce, 2 reduce/reduce + $ bison -Werror foo.y + bison: warnings being treated as errors + foo.y: conflicts: 1 shift/reduce, 2 reduce/reduce + + with the new behavior: + + $ bison foo.y + foo.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] + foo.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr] + $ bison -Werror foo.y + foo.y: error: 1 shift/reduce conflict [-Werror=conflicts-sr] + foo.y: error: 2 reduce/reduce conflicts [-Werror=conflicts-rr] + + When %expect or %expect-rr is used, such as with bar.y: + + %expect 0 + %glr-parser + %% + exp: exp '+' exp | '0' | '0'; + + Former behavior: + + $ bison bar.y + bar.y: conflicts: 1 shift/reduce, 2 reduce/reduce + bar.y: expected 0 shift/reduce conflicts + bar.y: expected 0 reduce/reduce conflicts + + New one: + + $ bison bar.y + bar.y: error: shift/reduce conflicts: 1 found, 0 expected + bar.y: error: reduce/reduce conflicts: 2 found, 0 expected + +** Additional yylex/yyparse arguments + + The new directive %param declares additional arguments to both yylex and + yyparse. The %lex-param, %parse-param, and %param directives support one + or more arguments. Instead of + + %lex-param {arg1_type *arg1} + %lex-param {arg2_type *arg2} + %parse-param {arg1_type *arg1} + %parse-param {arg2_type *arg2} + + one may now declare + + %param {arg1_type *arg1} {arg2_type *arg2} + +** Java skeleton improvements + + The constants for token names were moved to the Lexer interface. Also, it + is possible to add code to the parser's constructors using "%code init" + and "%define init_throws". + +** C++ skeletons improvements + +*** The parser header is no longer mandatory (lalr1.cc, glr.cc) + + Using %defines is now optional. Without it, the needed support classes + are defined in the generated parser, instead of additional files (such as + location.hh, position.hh and stack.hh). + +*** Locations are no longer mandatory (lalr1.cc, glr.cc) + + Both lalr1.cc and glr.cc no longer require %location. + +*** syntax_error exception (lalr1.cc) + + The C++ parser features a syntax_error exception, which can be + thrown from the scanner or from user rules to raise syntax errors. + This facilitates reporting errors caught in sub-functions (e.g., + rejecting too large integral literals from a conversion function + used by the scanner, or rejecting invalid combinations from a + factory invoked by the user actions). + +** Variable api.token.prefix + + The variable api.token.prefix changes the way tokens are identified in + the generated files. This is especially useful to avoid collisions + with identifiers in the target language. For instance + + %token FILE for ERROR + %define api.token.prefix "TOK_" + %% + start: FILE for ERROR; + + will generate the definition of the symbols TOK_FILE, TOK_for, and + TOK_ERROR in the generated sources. In particular, the scanner must + use these prefixed token names, although the grammar itself still + uses the short names (as in the sample rule given above). + +** Renamed %define variables + + The following variables have been renamed for consistency. Backward + compatibility is ensured, but upgrading is recommended. + + lr.default-reductions -> lr.default-reduction + lr.keep-unreachable-states -> lr.keep-unreachable-state + namespace -> api.namespace + +** Variable parse.error + + This variable controls the verbosity of error messages. The use of the + %error-verbose directive is deprecated in favor of "%define parse.error + verbose". + +** Semantic predicates + + The new, experimental, semantic-predicate feature allows actions of the + form "%?{ BOOLEAN-EXPRESSION }", which cause syntax errors (as for + YYERROR) if the expression evaluates to 0, and are evaluated immediately + in GLR parsers, rather than being deferred. The result is that they allow + the programmer to prune possible parses based on the values of run-time + expressions. + +** The directive %expect-rr is now an error in non GLR mode + + It used to be an error only if used in non GLR mode, _and_ if there are + reduce/reduce conflicts. - * Noteworthy changes in release ?.? (????-??-??) [?] - - ** %language is no longer an experimental feature. - - The introduction of this feature, in 2.4, was four years ago. The --language - option and the %language directive are no longer experimental. + * Noteworthy changes in release 2.7 (2012-12-12) [stable] ** Bug fixes Warnings about uninitialized yylloc in yyparse have been fixed. + Restored C90 compliance (yet no report was ever made). + ** Diagnostics are improved *** Changes in the format of error messages @@@ -448,7 -208,7 +445,7 @@@ * Noteworthy changes in release 2.6.1 (2012-07-30) [stable] - Bison no longer executes user-specified M4 code when processing a grammar. + Bison no longer executes user-specified M4 code when processing a grammar. ** Future Changes @@@ -486,7 -246,7 +483,7 @@@ * Noteworthy changes in release 2.6 (2012-07-19) [stable] -** Future Changes +** Future changes The next major release of Bison will drop support for the following deprecated features. Please report disagreements to bug-bison@gnu.org. @@@ -748,6 -508,7 +745,7 @@@ These features are experimental in this version. More user feedback will help to stabilize them. + Contributed by Alex Rozenman. ** IELR(1) and canonical LR(1): @@@ -1264,6 -1025,7 +1262,7 @@@ The current Java interface is experimental and may evolve. More user feedback will help to stabilize it. + Contributed by Paolo Bonzini. ** %language @@@ -1277,6 -1039,7 +1276,7 @@@ Bison can now generate an XML report of the LALR(1) automaton using the new "--xml" option. The current XML schema is experimental and may evolve. More user feedback will help to stabilize it. + Contributed by Wojciech Polak. ** The grammar file may now specify the name of the parser header file using %defines. For example: @@@ -2287,8 -2050,8 +2287,8 @@@ along with this program. If not, see < LocalWords: namespaces strerror const autoconfiguration Dconst Autoconf's FDL LocalWords: Automake TMPDIR LESSEQ ylwrap endif yydebug YYTOKEN YYLSP ival hh LocalWords: extern YYTOKENTYPE TOKENTYPE yytokentype tokentype STYPE lval pdf - LocalWords: lang yyoutput dvi html ps POSIX lvalp llocp calc yyo fval Wmaybe - LocalWords: yyvsp pragmas noreturn java's + LocalWords: lang yyoutput dvi html ps POSIX lvalp llocp Wother nterm arg init + LocalWords: TOK calc yyo fval Wconflicts Local Variables: mode: outline diff --combined THANKS index dbe54791,ed978d37..ed15fa02 --- a/THANKS +++ b/THANKS @@@ -76,7 -76,6 +76,7 @@@ Matt Kraai kraai@alumni. Matt Rosing rosing@peakfive.com Michael Hayes m.hayes@elec.canterbury.ac.nz Michael Raskin 7c6f434c@mail.ru +Michiel De Wilde mdewilde.agilent@gmail.com Mickael Labau labau_m@epita.fr Mike Castle dalgoda@ix.netcom.com Neil Booth NeilB@earthling.net @@@ -97,7 -96,6 +97,7 @@@ Peter Fales psfales@lucen Peter Hamorsky hamo@upjs.sk Peter Simons simons@cryp.to Piotr Gackiewicz gacek@intertel.com.pl +Quentin Hocquet hocquet@gostai.com Quoc Peyrot chojin@lrde.epita.fr R Blake blakers@mac.com Raja R Harinath harinath@cs.umn.edu @@@ -127,6 -125,7 +127,7 @@@ Vin Shelton acs@alumni.pr W.C.A. Wijngaards wouter@NLnetLabs.nl Wayne Green wayne@infosavvy.com Wei Song wsong83@gmail.com + Wojciech Polak polak@gnu.org Wolfgang S. Kechel wolfgang.kechel@prs.de Wolfram Wagner ww@mpi-sb.mpg.de Wwp subscript@free.fr diff --combined data/glr.c index 1e82e589,02a76c21..6c03af3b --- a/data/glr.c +++ b/data/glr.c @@@ -52,7 -52,7 +52,7 @@@ m4_ifndef([b4_pure_flag] # This is not shared with yacc.c in c.m4 because GLR relies on ISO C # formal argument declarations. m4_define([b4_user_formals], -[m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])]) +[m4_ifset([b4_parse_param], [, b4_formals(b4_parse_param)])]) # b4_lex_param @@@ -71,7 -71,7 +71,7 @@@ m4_ifdef([b4_lex_param], [, ]b4_lex_par # a trailing comma. m4_define([b4_yyerror_args], [b4_pure_if([b4_locations_if([yylocp, ])])dnl -m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])]) +m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])]) # b4_lyyerror_args @@@ -79,7 -79,7 +79,7 @@@ # Same as above, but on the lookahead, hence &yylloc instead of yylocp. m4_define([b4_lyyerror_args], [b4_pure_if([b4_locations_if([&yylloc, ])])dnl -m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])]) +m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])]) # b4_pure_args @@@ -126,15 -126,7 +126,15 @@@ m4_define([b4_locuser_args] # -------------------- # Expansion of $$. m4_define([b4_lhs_value], -[((*yyvalp)[]m4_ifval([$1], [.$1]))]) +[b4_symbol_value([(*yyvalp)], [$1])]) + + +# b4_rhs_data(RULE-LENGTH, NUM) +# ----------------------------- +# Expand to the semantic stack place that contains value and location +# of symbol number NUM in a rule of length RULE-LENGTH. +m4_define([b4_rhs_data], +[((yyGLRStackItem const *)yyvsp)@{YYFILL (b4_subtract([$2], [$1]))@}.yystate]) # b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) @@@ -142,7 -134,7 +142,7 @@@ # Expansion of $NUM, where the current rule has RULE-LENGTH # symbols on RHS. m4_define([b4_rhs_value], -[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3]))]) +[b4_symbol_value([b4_rhs_data([$1], [$2]).yysemantics.yysval], [$3])]) @@@ -162,7 -154,7 +162,7 @@@ m4_define([b4_lhs_location] # Expansion of @NUM, where the current rule has RULE-LENGTH symbols # on RHS. m4_define([b4_rhs_location], -[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yyloc)]) +[(b4_rhs_data([$1], [$2]).yyloc)]) ## -------------- ## @@@ -172,17 -164,16 +172,17 @@@ # b4_shared_declarations # ---------------------- # Declaration that might either go into the header (if --defines) -# or open coded in the parser body. -m4_define([b4_shared_declarations], +# or open coded in the parser body. glr.cc has its own definition. +m4_if(b4_skeleton, ["glr.c"], +[m4_define([b4_shared_declarations], [b4_declare_yydebug[ ]b4_percent_code_get([[requires]])[ -]b4_token_enums(b4_tokens)[ +]b4_token_enums[ ]b4_declare_yylstype[ -]b4_c_ansi_function_decl(b4_prefix[parse], [int], b4_parse_param)[ +]b4_function_declare(b4_prefix[parse], [int], b4_parse_param)[ ]b4_percent_code_get([[provides]])[]dnl ]) - +]) ## -------------- ## ## Output files. ## @@@ -212,7 -203,7 +212,7 @@@ b4_percent_code_get([[top]]) #define yynerrs ]b4_prefix[nerrs]b4_locations_if([[ #define yylloc ]b4_prefix[lloc]])])[ -/* Copy the first part of user declarations. */ +/* First part of user declarations. */ ]b4_user_pre_prologue[ ]b4_null_define[ @@@ -225,7 -216,7 +225,7 @@@ # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else -# define YYERROR_VERBOSE ]b4_error_verbose_flag[ +# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[ #endif /* Default (constant) value used for initialization for null @@@ -256,12 -247,22 +256,12 @@@ b4_percent_code_get[]dn #endif /* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ +#ifdef __GNUC__ # define YYUSE(E) ((void) (E)) #else # define YYUSE(E) /* empty */ #endif -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(N) (N) -#else -]b4_c_function_def([YYID], [static int], [[int i], [i]])[ -{ - return i; -} -#endif - #ifndef YYFREE # define YYFREE free #endif @@@ -286,7 -287,7 +286,7 @@@ # include # define YYJMP_BUF jmp_buf # define YYSETJMP(Env) setjmp (Env) - // Pacify clang. + /* Pacify clang. */ # define YYLONGJMP(Env, Val) (longjmp (Env, Val), YYASSERT (0)) #endif @@@ -339,6 -340,19 +339,6 @@@ static const ]b4_int_type_for([b4_trans }; #if ]b4_api_PREFIX[DEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const ]b4_int_type_for([b4_prhs])[ yyprhs[] = -{ - ]b4_prhs[ -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const ]b4_int_type_for([b4_rhs])[ yyrhs[] = -{ - ]b4_rhs[ -}; - /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const ]b4_int_type_for([b4_rline])[ yyrline[] = { @@@ -355,10 -369,17 +355,10 @@@ static const char *const yytname[] }; #endif -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const ]b4_int_type_for([b4_r1])[ yyr1[] = -{ - ]b4_r1[ -}; +#define YYPACT_NINF ]b4_pact_ninf[ +#define YYTABLE_NINF ]b4_table_ninf[ -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const ]b4_int_type_for([b4_r2])[ yyr2[] = -{ - ]b4_r2[ -}; +]b4_parser_tables_define[ /* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none). */ static const ]b4_int_type_for([b4_dprec])[ yydprec[] = @@@ -372,11 -393,41 +372,11 @@@ static const ]b4_int_type_for([b4_merge ]b4_merger[ }; -/* YYDEFACT[S] -- default reduction number in state S. Performed when - YYTABLE doesn't specify something else to do. Zero means the default - is an error. */ -static const ]b4_int_type_for([b4_defact])[ yydefact[] = -{ - ]b4_defact[ -}; - -/* 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. */ -#define YYPACT_NINF ]b4_pact_ninf[ -static const ]b4_int_type_for([b4_pact])[ yypact[] = -{ - ]b4_pact[ -}; - -/* YYPGOTO[NTERM-NUM]. */ -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 YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF ]b4_table_ninf[ -static const ]b4_int_type_for([b4_table])[ yytable[] = +/* YYIMMEDIATE[RULE-NUM] -- True iff rule #RULE-NUM is not to be deferred, as + in the case of predicates. */ +static const yybool yyimmediate[] = { - ]b4_table[ + ]b4_immediate[ }; /* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of @@@ -398,6 -449,18 +398,6 @@@ dnl We probably ought to introduce a ty ]b4_conflicting_rules[ }; -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[ -}; - /* Error token number */ #define YYTERROR 1 @@@ -408,7 -471,7 +408,7 @@@ ]b4_yy_location_print_define[ /* YYLEX -- calling `yylex' with the right arguments. */ -#define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[ +#define YYLEX ]b4_function_call([yylex], [int], b4_lex_param)[ ]b4_pure_if( [ @@@ -436,12 -499,9 +436,12 @@@ static const int YYEMPTY = -2 typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG; -#define YYCHK(YYE) \ - do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; } \ - while (YYID (0)) +#define YYCHK(YYE) \ + do { \ + YYRESULTTAG yychk_flag = YYE; \ + if (yychk_flag != yyok) \ + return yychk_flag; \ + } while (0) #if ]b4_api_PREFIX[DEBUG @@@ -450,22 -510,22 +450,22 @@@ # endif # define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -]b4_yy_symbol_print_generate([b4_c_ansi_function_def])[ - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) + do { \ + if (yydebug) \ + YYFPRINTF Args; \ + } while (0) + +]b4_yy_symbol_print_define[ + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ + do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[); \ + YYFPRINTF (stderr, "\n"); \ + } \ + } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ @@@ -502,7 -562,13 +502,7 @@@ int yydebug #define YYHEADROOM 2 #ifndef YYSTACKEXPANDABLE -# if (! defined __cplusplus \ - || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \ - && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL)) # define YYSTACKEXPANDABLE 1 -# else -# define YYSTACKEXPANDABLE 0 -# endif #endif #if YYSTACKEXPANDABLE @@@ -510,13 -576,13 +510,13 @@@ do { \ if (Yystack->yyspaceLeft < YYHEADROOM) \ yyexpandGLRStack (Yystack); \ - } while (YYID (0)) + } while (0) #else # define YY_RESERVE_GLRSTACK(Yystack) \ do { \ if (Yystack->yyspaceLeft < YYHEADROOM) \ yyMemoryExhausted (Yystack); \ - } while (YYID (0)) + } while (0) #endif @@@ -599,7 -665,7 +599,7 @@@ typedef int yyStateNum typedef int yyRuleNum; /** Grammar symbol */ -typedef short int yySymbol; +typedef int yySymbol; /** Item references, as in LALR(1) machine */ typedef short int yyItemNum; @@@ -620,7 -686,7 +620,7 @@@ struct yyGLRState yyStateNum yylrState; /** Preceding state in this stack */ yyGLRState* yypred; - /** Source position of the first token produced by my symbol */ + /** Source position of the last token produced by my symbol */ size_t yyposn; union { /** First in a chain of alternative reductions producing the @@@ -732,16 -798,9 +732,16 @@@ yyfillin (yyGLRStackItem *yyvsp, int yy yyGLRState *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;]b4_locations_if([[ +#if ]b4_api_PREFIX[DEBUG + yyvsp[i].yystate.yylrState = s->yylrState; +#endif + yyvsp[i].yystate.yyresolved = s->yyresolved; + if (s->yyresolved) + yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval; + else + /* The effect of using yysval or yyloc (in an immediate rule) is + * undefined. */ + yyvsp[i].yystate.yysemantics.yyfirstVal = YY_NULL;]b4_locations_if([[ yyvsp[i].yystate.yyloc = s->yyloc;]])[ s = yyvsp[i].yystate.yypred = s->yypred; } @@@ -768,7 -827,7 +768,7 @@@ yyfill (yyGLRStackItem *yyvsp, int *yyl * value ($$), and yylocp points to place for location information * (@@$). Returns yyok for normal return, yyaccept for YYACCEPT, * yyerr for YYERROR, yyabort for YYABORT. */ -/*ARGSUSED*/ static YYRESULTTAG +static YYRESULTTAG yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, yyGLRStack* yystackp, YYSTYPE* yyvalp]b4_locuser_formals[) @@@ -776,7 -835,7 +776,7 @@@ yybool yynormal __attribute__ ((__unused__)) = (yystackp->yysplitPoint == YY_NULL); int yylow; -]b4_parse_param_use[]dnl +]b4_parse_param_use([yyvalp], [yylocp])dnl [# undef yyerrok # define yyerrok (yystackp->yyerrState = 0) # undef YYACCEPT @@@ -819,9 -878,9 +819,9 @@@ # undef yyclearin # undef YYRECOVERING } - -/*ARGSUSED*/ static void + +static void yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1) { YYUSE (yy0); @@@ -829,14 -888,14 +829,14 @@@ switch (yyn) { - ]b4_mergers[ +]b4_mergers[ default: break; } } /* Bison grammar-table manipulation. */ -]b4_yydestruct_generate([b4_c_ansi_function_def])[ +]b4_yydestruct_define[ /** Number of symbols composing the right hand side of rule #RULE. */ static inline int @@@ -879,7 -938,7 +879,7 @@@ yydestroyGLRState (char const *yymsg, y } } -/** Left-hand-side symbol for rule #RULE. */ +/** Left-hand-side symbol for rule #YYRULE. */ static inline yySymbol yylhsNonterm (yyRuleNum yyrule) { @@@ -889,7 -948,7 +889,7 @@@ #define yypact_value_is_default(Yystate) \ ]b4_table_value_equals([[pact]], [[Yystate]], [b4_pact_ninf])[ -/** True iff LR state STATE has only a default reduction (regardless +/** True iff LR state YYSTATE has only a default reduction (regardless * of token). */ static inline yybool yyisDefaultedState (yyStateNum yystate) @@@ -897,7 -956,7 +897,7 @@@ return yypact_value_is_default (yypact[yystate]); } -/** The default reduction for STATE, assuming it has one. */ +/** The default reduction for YYSTATE, assuming it has one. */ static inline yyRuleNum yydefaultAction (yyStateNum yystate) { @@@ -912,8 -971,8 +912,8 @@@ * R < 0: Reduce on rule -R. * R = 0: Error. * R > 0: Shift to state R. - * Set *CONFLICTS to a pointer into yyconfl to 0-terminated list of - * conflicting reductions. + * Set *YYCONFLICTS to a pointer into yyconfl to a 0-terminated list + * of conflicting reductions. */ static inline void yygetLRActions (yyStateNum yystate, int yytoken, @@@ -941,7 -1000,8 +941,7 @@@ static inline yyStateNum yyLRgotoState (yyStateNum yystate, yySymbol yylhs) { - int yyr; - yyr = yypgoto[yylhs - YYNTOKENS] + yystate; + int yyr = yypgoto[yylhs - YYNTOKENS] + yystate; if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate) return yytable[yyr]; else @@@ -962,10 -1022,9 +962,10 @@@ yyisErrorAction (int yyaction /* GLRStates */ -/** Return a fresh GLRStackItem. Callers should call - * YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient - * headroom. */ +/** Return a fresh GLRStackItem in YYSTACKP. The item is an LR state + * if YYISSTATE, and otherwise a semantic option. Callers should call + * YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient + * headroom. */ static inline yyGLRStackItem* yynewGLRStackItem (yyGLRStack* yystackp, yybool yyisState) @@@ -978,16 -1037,16 +978,16 @@@ } /** Add a new semantic action that will execute the action for rule - * RULENUM on the semantic values in RHS to the list of - * alternative actions for STATE. Assumes that RHS comes from - * stack #K of *STACKP. */ + * YYRULE on the semantic values in YYRHS to the list of + * alternative actions for YYSTATE. Assumes that YYRHS comes from + * stack #YYK of *YYSTACKP. */ static void yyaddDeferredAction (yyGLRStack* yystackp, size_t yyk, yyGLRState* yystate, - yyGLRState* rhs, yyRuleNum yyrule) + yyGLRState* yyrhs, yyRuleNum yyrule) { yySemanticOption* yynewOption = &yynewGLRStackItem (yystackp, yyfalse)->yyoption; - yynewOption->yystate = rhs; + yynewOption->yystate = yyrhs; yynewOption->yyrule = yyrule; if (yystackp->yytops.yylookaheadNeeds[yyk]) { @@@ -1005,7 -1064,7 +1005,7 @@@ /* GLRStacks */ -/** Initialize SET to a singleton set containing an empty stack. */ +/** Initialize YYSET to a singleton set containing an empty stack. */ static yybool yyinitStateSet (yyGLRStateSet* yyset) { @@@ -1031,8 -1090,8 +1031,8 @@@ static void yyfreeStateSet (yyGLRStateS YYFREE (yyset->yylookaheadNeeds); } -/** Initialize STACK to a single empty stack, with total maximum - * capacity for all stacks of SIZE. */ +/** Initialize *YYSTACKP to a single empty stack, with total maximum + * capacity for all stacks of YYSIZE. */ static yybool yyinitGLRStack (yyGLRStack* yystackp, size_t yysize) { @@@ -1054,7 -1113,7 +1054,7 @@@ # define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \ &((YYTOITEMS) - ((YYFROMITEMS) - (yyGLRStackItem*) (YYX)))->YYTYPE -/** If STACK is expandable, extend it. WARNING: Pointers into the +/** If *YYSTACKP is expandable, extend it. WARNING: Pointers into the stack from outside should be considered invalid after this call. We always expand when there are 1 or fewer items left AFTER an allocation, so that we can avoid having external pointers exist @@@ -1124,9 -1183,9 +1124,9 @@@ yyfreeGLRStack (yyGLRStack* yystackp yyfreeStateSet (&yystackp->yytops); } -/** Assuming that S is a GLRState somewhere on STACK, update the - * splitpoint of STACK, if needed, so that it is at least as deep as - * S. */ +/** Assuming that YYS is a GLRState somewhere on *YYSTACKP, update the + * splitpoint of *YYSTACKP, if needed, so that it is at least as deep as + * YYS. */ static inline void yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys) { @@@ -1134,7 -1193,7 +1134,7 @@@ yystackp->yysplitPoint = yys; } -/** Invalidate stack #K in STACK. */ +/** Invalidate stack #YYK in *YYSTACKP. */ static inline void yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk) { @@@ -1143,8 -1202,8 +1143,8 @@@ yystackp->yytops.yystates[yyk] = YY_NULL; } -/** Undelete the last stack that was marked as deleted. Can only be - done once after a deletion, and only when all other stacks have +/** Undelete the last stack in *YYSTACKP that was marked as deleted. Can + only be done once after a deletion, and only when all other stacks have been deleted. */ static void yyundeleteLastStack (yyGLRStack* yystackp) @@@ -1193,9 -1252,8 +1193,9 @@@ yyremoveDeletes (yyGLRStack* yystackp } } -/** Shift to a new state on stack #K of STACK, corresponding to LR state - * LRSTATE, at input position POSN, with (resolved) semantic value SVAL. */ +/** Shift to a new state on stack #YYK of *YYSTACKP, corresponding to LR + * state YYLRSTATE, at input position YYPOSN, with (resolved) semantic + * value *YYVALP and source location *YYLOCP. */ static inline void yyglrShift (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState, size_t yyposn, @@@ -1214,12 -1272,12 +1214,12 @@@ YY_RESERVE_GLRSTACK (yystackp); } -/** Shift stack #K of YYSTACK, to a new state corresponding to LR +/** Shift stack #YYK of *YYSTACKP, 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* yystackp, size_t yyk, yyStateNum yylrState, - size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule) + size_t yyposn, yyGLRState* yyrhs, yyRuleNum yyrule) { yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate; @@@ -1231,55 -1289,14 +1231,55 @@@ yystackp->yytops.yystates[yyk] = yynewState; /* Invokes YY_RESERVE_GLRSTACK. */ - yyaddDeferredAction (yystackp, yyk, yynewState, rhs, yyrule); + yyaddDeferredAction (yystackp, yyk, yynewState, yyrhs, yyrule); } -/** Pop the symbols consumed by reduction #RULE from the top of stack - * #K of STACK, and perform the appropriate semantic action on their +#if !]b4_api_PREFIX[DEBUG +# define YY_REDUCE_PRINT(Args) +#else +# define YY_REDUCE_PRINT(Args) \ +do { \ + if (yydebug) \ + yy_reduce_print Args; \ +} while (0) + +/*----------------------------------------------------------------------. +| Report that stack #YYK of *YYSTACKP is going to be reduced by YYRULE. | +`----------------------------------------------------------------------*/ + +static inline void +yy_reduce_print (int yynormal, yyGLRStackItem* yyvsp, size_t yyk, + yyRuleNum yyrule]b4_user_formals[) +{ + int yynrhs = yyrhsLength (yyrule);]b4_locations_if([ + int yylow = 1;])[ + int yyi; + YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n", + (unsigned long int) yyk, yyrule - 1, + (unsigned long int) yyrline[yyrule]); + if (! yynormal) + yyfillin (yyvsp, 1, -yynrhs); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + yystos[yyvsp[yyi - yynrhs + 1].yystate.yylrState], + &yyvsp[yyi - yynrhs + 1].yystate.yysemantics.yysval + ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl + b4_user_args[); + if (!yyvsp[yyi - yynrhs + 1].yystate.yyresolved) + YYFPRINTF (stderr, " (unresolved)"); + YYFPRINTF (stderr, "\n"); + } +} +#endif + +/** Pop the symbols consumed by reduction #YYRULE from the top of stack + * #YYK of *YYSTACKP, and perform the appropriate semantic action on their * semantic values. Assumes that all ambiguities in semantic values - * have been previously resolved. Set *VALP to the resulting value, - * and *LOCP to the computed location (if any). Return value is as + * have been previously resolved. Set *YYVALP to the resulting value, + * and *YYLOCP to the computed location (if any). Return value is as * for userAction. */ static inline YYRESULTTAG yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, @@@ -1290,17 -1307,20 +1290,17 @@@ if (yystackp->yysplitPoint == YY_NULL) { /* Standard special case: single stack. */ - yyGLRStackItem* rhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk]; + yyGLRStackItem* yyrhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk]; YYASSERT (yyk == 0); yystackp->yynextFree -= yynrhs; yystackp->yyspaceLeft += yynrhs; yystackp->yytops.yystates[0] = & yystackp->yynextFree[-1].yystate; - return yyuserAction (yyrule, yynrhs, rhs, yystackp, + YY_REDUCE_PRINT ((1, yyrhs, yyk, yyrule]b4_user_args[)); + return yyuserAction (yyrule, yynrhs, yyrhs, yystackp, yyvalp]b4_locuser_args[); } else { - /* At present, doAction is never called in nondeterministic - * mode, so this branch is never taken. It is here in - * anticipation of a future feature that will allow immediate - * evaluation of selected actions in nondeterministic mode. */ int yyi; yyGLRState* yys; yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1]; @@@ -1316,21 -1336,62 +1316,21 @@@ } yyupdateSplit (yystackp, yys); yystackp->yytops.yystates[yyk] = yys; + YY_REDUCE_PRINT ((0, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yyk, yyrule]b4_user_args[)); return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yystackp, yyvalp]b4_locuser_args[); } } -#if !]b4_api_PREFIX[DEBUG -# define YY_REDUCE_PRINT(Args) -#else -# define YY_REDUCE_PRINT(Args) \ -do { \ - if (yydebug) \ - yy_reduce_print Args; \ -} while (YYID (0)) - -/*----------------------------------------------------------. -| Report that the RULE is going to be reduced on stack #K. | -`----------------------------------------------------------*/ - -/*ARGSUSED*/ static inline void -yy_reduce_print (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, - YYSTYPE* yyvalp]b4_locuser_formals[) -{ - int yynrhs = yyrhsLength (yyrule); - yybool yynormal __attribute__ ((__unused__)) = - (yystackp->yysplitPoint == YY_NULL); - yyGLRStackItem* yyvsp = (yyGLRStackItem*) yystackp->yytops.yystates[yyk]; - int yylow = 1; - int yyi; - YYUSE (yyvalp);]b4_locations_if([ - YYUSE (yylocp);])[ -]b4_parse_param_use[]dnl -[ YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n", - (unsigned long int) yyk, yyrule - 1, - (unsigned long int) yyrline[yyrule]); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &]b4_rhs_value(yynrhs, yyi + 1)[ - ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl - b4_user_args[); - YYFPRINTF (stderr, "\n"); - } -} -#endif - -/** Pop items off stack #K of STACK according to grammar rule RULE, +/** Pop items off stack #YYK of *YYSTACKP according to grammar rule YYRULE, * and push back on the resulting nonterminal symbol. Perform the - * semantic action associated with RULE and store its value with the - * newly pushed state, if FORCEEVAL or if STACK is currently + * semantic action associated with YYRULE and store its value with the + * newly pushed state, if YYFORCEEVAL or if *YYSTACKP is currently * unambiguous. Otherwise, store the deferred semantic action with * the new state. If the new state would have an identical input * position, LR state, and predecessor to an existing state on the stack, - * it is identified with that existing state, eliminating stack #K from - * the STACK. In this case, the (necessarily deferred) semantic value is + * it is identified with that existing state, eliminating stack #YYK from + * *YYSTACKP. In this case, the semantic value is * added to the options for the existing state's semantic value. */ static inline YYRESULTTAG @@@ -1341,18 -1402,11 +1341,18 @@@ yyglrReduce (yyGLRStack* yystackp, size if (yyforceEval || yystackp->yysplitPoint == YY_NULL) { + YYRESULTTAG yyflag; YYSTYPE yysval;]b4_locations_if([ YYLTYPE yyloc;])[ - YY_REDUCE_PRINT ((yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[)); - YYCHK (yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[)); + yyflag = yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[); + if (yyflag == yyerr && yystackp->yysplitPoint != YY_NULL) + { + YYDPRINTF ((stderr, "Parse on stack %lu rejected by rule #%d.\n", + (unsigned long int) yyk, yyrule - 1)); + } + if (yyflag != yyok) + return yyflag; YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyrule], &yysval, &yyloc); yyglrShift (yystackp, yyk, yyLRgotoState (yystackp->yytops.yystates[yyk]->yylrState, @@@ -1375,8 -1429,7 +1375,8 @@@ yyupdateSplit (yystackp, yys); yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule)); YYDPRINTF ((stderr, - "Reduced stack %lu by rule #%d; action deferred. Now in state %d.\n", + "Reduced stack %lu by rule #%d; action deferred. " + "Now in state %d.\n", (unsigned long int) yyk, yyrule - 1, yynewLRState)); for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1) if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULL) @@@ -1447,7 -1500,7 +1447,7 @@@ yysplitStack (yyGLRStack* yystackp, siz return yystackp->yytops.yysize-1; } -/** True iff Y0 and Y1 represent identical options at the top level. +/** True iff YYY0 and YYY1 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 yybool @@@ -1469,8 -1522,8 +1469,8 @@@ yyidenticalOptions (yySemanticOption* y return yyfalse; } -/** Assuming identicalOptions (Y0,Y1), destructively merge the - * alternative semantic values for the RHS-symbols of Y1 and Y0. */ +/** Assuming identicalOptions (YYY0,YYY1), destructively merge the + * alternative semantic values for the RHS-symbols of YYY1 and YYY0. */ static void yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1) { @@@ -1497,7 -1550,7 +1497,7 @@@ { yySemanticOption** yyz0p = &yys0->yysemantics.yyfirstVal; yySemanticOption* yyz1 = yys1->yysemantics.yyfirstVal; - while (YYID (yytrue)) + while (yytrue) { if (yyz1 == *yyz0p || yyz1 == YY_NULL) break; @@@ -1549,11 -1602,11 +1549,11 @@@ static YYRESULTTAG yyresolveValue (yyGL yyGLRStack* yystackp]b4_user_formals[); -/** Resolve the previous N states starting at and including state S. If result - * != yyok, some states may have been left unresolved possibly with empty - * semantic option chains. Regardless of whether result = yyok, each state - * has been left with consistent data so that yydestroyGLRState can be invoked - * if necessary. */ +/** Resolve the previous YYN states starting at and including state YYS + * on *YYSTACKP. If result != yyok, some states may have been left + * unresolved possibly with empty semantic option chains. Regardless + * of whether result = yyok, each state has been left with consistent + * data so that yydestroyGLRState can be invoked if necessary. */ static YYRESULTTAG yyresolveStates (yyGLRState* yys, int yyn, yyGLRStack* yystackp]b4_user_formals[) @@@ -1568,10 -1621,9 +1568,10 @@@ return yyok; } -/** Resolve the states for the RHS of OPT, perform its user action, and return - * the semantic value and location. Regardless of whether result = yyok, all - * RHS states have been destroyed (assuming the user action destroys all RHS +/** Resolve the states for the RHS of YYOPT on *YYSTACKP, perform its + * user action, and return the semantic value and location in *YYVALP + * and *YYLOCP. Regardless of whether result = yyok, all RHS states + * have been destroyed (assuming the user action destroys all RHS * semantic values if invoked). */ static YYRESULTTAG yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystackp, @@@ -1645,11 -1697,11 +1645,11 @@@ yyreportTree (yySemanticOption* yyx, in { if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn) YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", - yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1])); + yytokenName (yystos[yystates[yyi]->yylrState])); else YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", - yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]), - (unsigned long int) (yystates[yyi - 1]->yyposn + 1), + yytokenName (yystos[yystates[yyi]->yylrState]), + (unsigned long int) (yystates[yyi-1]->yyposn + 1), (unsigned long int) yystates[yyi]->yyposn); } else @@@ -1658,7 -1710,7 +1658,7 @@@ } #endif -/*ARGSUSED*/ static YYRESULTTAG +static YYRESULTTAG yyreportAmbiguity (yySemanticOption* yyx0, yySemanticOption* yyx1]b4_pure_formals[) { @@@ -1678,9 -1730,9 +1678,9 @@@ return yyabort; }]b4_locations_if([[ -/** Starting at and including state S1, resolve the location for each of the - * previous N1 states that is unresolved. The first semantic option of a state - * is always chosen. */ +/** Resolve the locations for each of the YYN1 states in *YYSTACKP, + * ending at YYS1. Has no effect on previously resolved states. + * The first semantic option of a state is always chosen. */ static void yyresolveLocations (yyGLRState* yys1, int yyn1, yyGLRStack *yystackp]b4_user_formals[) @@@ -1734,12 -1786,11 +1734,12 @@@ } }]])[ -/** Resolve the ambiguity represented in state S, perform the indicated - * actions, and set the semantic value of S. If result != yyok, the chain of - * semantic options in S has been cleared instead or it has been left - * unmodified except that redundant options may have been removed. Regardless - * of whether result = yyok, S has been left with consistent data so that +/** Resolve the ambiguity represented in state YYS in *YYSTACKP, + * perform the indicated actions, and set the semantic value of YYS. + * If result != yyok, the chain of semantic options in YYS has been + * cleared instead or it has been left unmodified except that + * redundant options may have been removed. Regardless of whether + * result = yyok, YYS has been left with consistent data so that * yydestroyGLRState can be invoked if necessary. */ static YYRESULTTAG yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[) @@@ -1877,6 -1928,10 +1877,6 @@@ static YYRESULTTA yyprocessOneStack (yyGLRStack* yystackp, size_t yyk, size_t yyposn]b4_pure_formals[) { - int yyaction; - const short int* yyconflicts; - yyRuleNum yyrule; - while (yystackp->yytops.yystates[yyk] != YY_NULL) { yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState; @@@ -1887,8 -1942,7 +1887,8 @@@ if (yyisDefaultedState (yystate)) { - yyrule = yydefaultAction (yystate); + YYRESULTTAG yyflag; + yyRuleNum yyrule = yydefaultAction (yystate); if (yyrule == 0) { YYDPRINTF ((stderr, "Stack %lu dies.\n", @@@ -1896,25 -1950,11 +1896,25 @@@ yymarkStackDeleted (yystackp, yyk); return yyok; } - YYCHK (yyglrReduce (yystackp, yyk, yyrule, yyfalse]b4_user_args[)); + yyflag = yyglrReduce (yystackp, yyk, yyrule, yyimmediate[yyrule]]b4_user_args[); + if (yyflag == yyerr) + { + YYDPRINTF ((stderr, + "Stack %lu dies " + "(predicate failure or explicit user error).\n", + (unsigned long int) yyk)); + yymarkStackDeleted (yystackp, yyk); + return yyok; + } + if (yyflag != yyok) + return yyflag; } else { yySymbol yytoken; + int yyaction; + const short int* yyconflicts; + yystackp->yytops.yylookaheadNeeds[yyk] = yytrue; if (yychar == YYEMPTY) { @@@ -1937,25 -1977,14 +1937,25 @@@ while (*yyconflicts != 0) { + YYRESULTTAG yyflag; size_t yynewStack = yysplitStack (yystackp, yyk); YYDPRINTF ((stderr, "Splitting off stack %lu from %lu.\n", (unsigned long int) yynewStack, (unsigned long int) yyk)); - YYCHK (yyglrReduce (yystackp, yynewStack, - *yyconflicts, yyfalse]b4_user_args[)); - YYCHK (yyprocessOneStack (yystackp, yynewStack, - yyposn]b4_pure_args[)); + yyflag = yyglrReduce (yystackp, yynewStack, + *yyconflicts, + yyimmediate[*yyconflicts]]b4_user_args[); + if (yyflag == yyok) + YYCHK (yyprocessOneStack (yystackp, yynewStack, + yyposn]b4_pure_args[)); + else if (yyflag == yyerr) + { + YYDPRINTF ((stderr, "Stack %lu dies.\n", + (unsigned long int) yynewStack)); + yymarkStackDeleted (yystackp, yynewStack); + } + else + return yyflag; yyconflicts += 1; } @@@ -1969,27 -1998,14 +1969,27 @@@ break; } else - YYCHK (yyglrReduce (yystackp, yyk, -yyaction, - yyfalse]b4_user_args[)); + { + YYRESULTTAG yyflag = yyglrReduce (yystackp, yyk, -yyaction, + yyimmediate[-yyaction]]b4_user_args[); + if (yyflag == yyerr) + { + YYDPRINTF ((stderr, + "Stack %lu dies " + "(predicate failure or explicit user error).\n", + (unsigned long int) yyk)); + yymarkStackDeleted (yystackp, yyk); + break; + } + else if (yyflag != yyok) + return yyflag; + } } } return yyok; } -/*ARGSUSED*/ static void +static void yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[) { if (yystackp->yyerrState != 0) @@@ -1997,10 -2013,10 +1997,10 @@@ #if ! YYERROR_VERBOSE yyerror (]b4_lyyerror_args[YY_("syntax error")); #else + { yySymbol yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); size_t yysize0 = yytnamerr (YY_NULL, yytokenName (yytoken)); size_t yysize = yysize0; - size_t yysize1; yybool yysize_overflow = yyfalse; char* yymsg = YY_NULL; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; @@@ -2060,9 -2076,11 +2060,11 @@@ break; } yyarg[yycount++] = yytokenName (yyx); - yysize1 = yysize + yytnamerr (YY_NULL, yytokenName (yyx)); - yysize_overflow |= yysize1 < yysize; - yysize = yysize1; + { + size_t yysz = yysize + yytnamerr (YY_NULL, yytokenName (yyx)); + yysize_overflow |= yysz < yysize; + yysize = yysz; + } } } } @@@ -2082,9 -2100,11 +2084,11 @@@ #undef YYCASE_ } - yysize1 = yysize + strlen (yyformat); - yysize_overflow |= yysize1 < yysize; - yysize = yysize1; + { + size_t yysz = yysize + strlen (yyformat); + yysize_overflow |= yysz < yysize; + yysize = yysz; + } if (!yysize_overflow) yymsg = (char *) YYMALLOC (yysize); @@@ -2114,6 -2134,7 +2118,7 @@@ yyerror (]b4_lyyerror_args[YY_("syntax error")); yyMemoryExhausted (yystackp); } + } #endif /* YYERROR_VERBOSE */ yynerrs += 1; } @@@ -2121,7 -2142,7 +2126,7 @@@ /* Recover from a syntax error on *YYSTACKP, assuming that *YYSTACKP->YYTOKENP, yylval, and yylloc are the syntactic category, semantic value, and location of the lookahead. */ -/*ARGSUSED*/ static void +static void yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[) { size_t yyk; @@@ -2130,7 -2151,7 +2135,7 @@@ if (yystackp->yyerrState == 3) /* We just shifted the error token and (perhaps) took some reductions. Skip tokens until we can proceed. */ - while (YYID (yytrue)) + while (yytrue) { yySymbol yytoken; if (yychar == YYEOF) @@@ -2234,13 -2255,14 +2239,13 @@@ default: \ goto yybuglab; \ } \ - } while (YYID (0)) - + } while (0) /*----------. | yyparse. | `----------*/ -]b4_c_ansi_function_def([yyparse], [int], b4_parse_param)[ +]b4_function_define([yyparse], [int], b4_parse_param)[ { int yyresult; yyGLRStack yystack; @@@ -2254,8 -2276,8 +2259,8 @@@ yylloc = yyloc_default;])[ ]m4_ifdef([b4_initial_action], [ b4_dollar_pushdef([yylval], [], [yylloc])dnl -/* User initialization code. */ -b4_user_initial_action + /* User initialization code. */ + b4_user_initial_action b4_dollar_popdef])[]dnl [ if (! yyinitGLRStack (yystackp, YYINITDEPTH)) @@@ -2270,13 -2292,13 +2275,13 @@@ yyglrShift (&yystack, 0, 0, 0, &yylval]b4_locations_if([, &yylloc])[); yyposn = 0; - while (YYID (yytrue)) + while (yytrue) { /* For efficiency, we have two loops, the first of which is specialized to deterministic operation (single stack, no potential ambiguity). */ /* Standard mode */ - while (YYID (yytrue)) + while (yytrue) { yyRuleNum yyrule; int yyaction; @@@ -2340,7 -2362,7 +2345,7 @@@ } } - while (YYID (yytrue)) + while (yytrue) { yySymbol yytoken_to_shift; size_t yys; @@@ -2472,7 -2494,8 +2477,7 @@@ yyfreeGLRStack (&yystack); } - /* Make sure YYID is used. */ - return YYID (yyresult); + return yyresult; } /* DEBUGGING ONLY */ diff --combined data/yacc.c index 9bd80280,b34549f1..7a2587ab --- a/data/yacc.c +++ b/data/yacc.c @@@ -1,12 -1,10 +1,12 @@@ -*- C -*- - # Yacc compatible skeleton for Bison # Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, # Inc. +m4_pushdef([b4_copyright_years], + [1984, 1989-1990, 2000-2012]) + # 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 3 of the License, or @@@ -97,7 -95,7 +97,7 @@@ m4_define([b4_yyerror_arg_loc_if] # Arguments passed to yyerror: user args plus yylloc. m4_define([b4_yyerror_args], [b4_yyerror_arg_loc_if([&yylloc, ])dnl -m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])]) +m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])]) # b4_lex_param @@@ -129,7 -127,7 +129,7 @@@ m4_define([b4_int_type] m4_eval([0 <= $1]), [1], [unsigned int], - [int])]) + [int])]) ## ----------------- ## @@@ -141,7 -139,7 +141,7 @@@ # -------------------- # Expansion of $$. m4_define([b4_lhs_value], -[(yyval[]m4_ifval([$1], [.$1]))]) +[b4_symbol_value(yyval, [$1])]) # b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) @@@ -149,7 -147,7 +149,7 @@@ # Expansion of $NUM, where the current rule has RULE-LENGTH # symbols on RHS. m4_define([b4_rhs_value], -[(yyvsp@{($2) - ($1)@}m4_ifval([$3], [.$3]))]) + [b4_symbol_value([yyvsp@{b4_subtract([$2], [$1])@}], [$3])]) @@@ -169,7 -167,7 +169,7 @@@ m4_define([b4_lhs_location] # Expansion of @NUM, where the current rule has RULE-LENGTH symbols # on RHS. m4_define([b4_rhs_location], -[(yylsp@{($2) - ($1)@})]) + [(yylsp@{b4_subtract([$2], [$1])@})]) ## -------------- ## @@@ -276,19 -274,19 +276,19 @@@ enum { YYPUSH_MORE = 4 } typedef struct ]b4_prefix[pstate ]b4_prefix[pstate; -]b4_pull_if([b4_c_function_decl([b4_prefix[parse]], [[int]], b4_parse_param) -])b4_c_function_decl([b4_prefix[push_parse]], [[int]], +]b4_pull_if([b4_function_declare([b4_prefix[parse]], [[int]], b4_parse_param) +])b4_function_declare([b4_prefix[push_parse]], [[int]], [[b4_prefix[pstate *ps]], [[ps]]]b4_pure_if([, [[[int pushed_char]], [[pushed_char]]], [[b4_api_PREFIX[STYPE const *pushed_val]], [[pushed_val]]]b4_locations_if([, [[b4_api_PREFIX[LTYPE *pushed_loc]], [[pushed_loc]]]])])m4_ifset([b4_parse_param], [, b4_parse_param])) -b4_pull_if([b4_c_function_decl([b4_prefix[pull_parse]], [[int]], +b4_pull_if([b4_function_declare([b4_prefix[pull_parse]], [[int]], [[b4_prefix[pstate *ps]], [[ps]]]m4_ifset([b4_parse_param], [, b4_parse_param]))]) -b4_c_function_decl([b4_prefix[pstate_new]], [b4_prefix[pstate *]], +b4_function_declare([b4_prefix[pstate_new]], [b4_prefix[pstate *]], [[[void]], []]) -b4_c_function_decl([b4_prefix[pstate_delete]], [[void]], +b4_function_declare([b4_prefix[pstate_delete]], [[void]], [[b4_prefix[pstate *ps]], [[ps]]])dnl ]) @@@ -296,7 -294,13 +296,7 @@@ # ------------------- # When not the push parser. m4_define([b4_declare_yyparse_], -[[#ifdef YYPARSE_PARAM -]b4_c_function_decl(b4_prefix[parse], [int], - [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[ -#else /* ! YYPARSE_PARAM */ -]b4_c_function_decl(b4_prefix[parse], [int], b4_parse_param)[ -#endif /* ! YYPARSE_PARAM */]dnl -]) +[b4_function_declare(b4_prefix[parse], [int], b4_parse_param)]) # b4_declare_yyparse @@@ -315,19 -319,21 +315,19 @@@ m4_define([b4_shared_declarations] [b4_cpp_guard_open([b4_spec_defines_file])[ ]b4_declare_yydebug[ ]b4_percent_code_get([[requires]])[ -]b4_token_enums_defines(b4_tokens)[ +]b4_token_enums_defines[ ]b4_declare_yylstype[ ]b4_declare_yyparse[ ]b4_percent_code_get([[provides]])[ ]b4_cpp_guard_close([b4_spec_defines_file])[]dnl ]) - ## -------------- ## ## Output files. ## ## -------------- ## b4_output_begin([b4_parser_file_name]) -b4_copyright([Bison implementation for Yacc-like parsers in C], - [1984, 1989-1990, 2000-2012])[ +b4_copyright([Bison implementation for Yacc-like parsers in C])[ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ @@@ -371,7 -377,7 +371,7 @@@ m4_if(b4_api_prefix, [yy], [] # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else -# define YYERROR_VERBOSE ]b4_error_verbose_flag[ +# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[ #endif ]m4_ifval(m4_quote(b4_spec_defines_file), @@@ -396,8 -402,10 +396,8 @@@ typedef unsigned char yytype_uint8 #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; -#elif ]b4_c_modern[ -typedef signed char yytype_int8; #else -typedef short int yytype_int8; +typedef signed char yytype_int8; #endif #ifdef YYTYPE_UINT16 @@@ -417,7 -425,7 +417,7 @@@ typedef short int yytype_int16 # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t -# elif ! defined YYSIZE_T && ]b4_c_modern[ +# elif ! defined YYSIZE_T # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else @@@ -440,12 -448,22 +440,12 @@@ #endif /* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ +#ifdef __GNUC__ # define YYUSE(E) ((void) (E)) #else # define YYUSE(E) /* empty */ #endif -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(N) (N) -#else -]b4_c_function_def([YYID], [static int], [[int yyi], [yyi]])[ -{ - return yyi; -} -#endif - #if ]b4_lac_if([[1]], [[! defined yyoverflow || YYERROR_VERBOSE]])[ /* The parser invokes alloca or malloc; define the necessary symbols. */]dnl @@@ -464,7 -482,7 +464,7 @@@ b4_push_if([], [b4_lac_if([], [ # define alloca _alloca # else # define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && ]b4_c_modern[ +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS @@@ -477,7 -495,7 +477,7 @@@ # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely @@@ -493,7 -511,7 +493,7 @@@ # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) + && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 @@@ -501,13 -519,13 +501,13 @@@ # endif # ifndef YYMALLOC # define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS && ]b4_c_modern[ +# if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS && ]b4_c_modern[ +# if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif @@@ -518,8 -536,8 +518,8 @@@ #if (! defined yyoverflow \ && (! defined __cplusplus \ - || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \ - && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL))) + || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \ + && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc @@@ -549,16 -567,16 +549,16 @@@ elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) #endif @@@ -577,7 -595,7 +577,7 @@@ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ - while (YYID (0)) + while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ @@@ -593,27 -611,41 +593,27 @@@ #define YYNNTS ]b4_nterms_number[ /* YYNRULES -- Number of rules. */ #define YYNRULES ]b4_rules_number[ -/* YYNRULES -- Number of states. */ +/* YYNSTATES -- Number of states. */ #define YYNSTATES ]b4_states_number[ -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned + by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK ]b4_undef_token_number[ #define YYMAXUTOK ]b4_user_token_number_max[ -#define YYTRANSLATE(YYX) \ +#define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, without out-of-bounds checking. */ static const ]b4_int_type_for([b4_translate])[ yytranslate[] = { ]b4_translate[ }; #if ]b4_api_PREFIX[DEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const ]b4_int_type_for([b4_prhs])[ yyprhs[] = -{ - ]b4_prhs[ -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const ]b4_int_type_for([b4_rhs])[ yyrhs[] = -{ - ]b4_rhs[ -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const ]b4_int_type_for([b4_rline])[ yyrline[] = -{ - ]b4_rline[ -}; +]b4_integral_parser_table_define([rline], [b4_rline], + [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[ #endif #if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[ @@@ -626,35 -658,105 +626,35 @@@ static const char *const yytname[] #endif # ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ +/* YYTOKNUM[NUM] -- (External) token number corresponding to the + (internal) symbol number NUM (which must be that of a token). */ static const ]b4_int_type_for([b4_toknum])[ yytoknum[] = { ]b4_toknum[ }; # endif -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -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_int_type_for([b4_r2])[ yyr2[] = -{ - ]b4_r2[ -}; - -/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const ]b4_int_type_for([b4_defact])[ yydefact[] = -{ - ]b4_defact[ -}; - -/* YYDEFGOTO[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. */ #define YYPACT_NINF ]b4_pact_ninf[ -static const ]b4_int_type_for([b4_pact])[ yypact[] = -{ - ]b4_pact[ -}; - -/* YYPGOTO[NTERM-NUM]. */ -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 YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF ]b4_table_ninf[ -static const ]b4_int_type_for([b4_table])[ yytable[] = -{ - ]b4_table[ -}; #define yypact_value_is_default(Yystate) \ ]b4_table_value_equals([[pact]], [[Yystate]], [b4_pact_ninf])[ +#define YYTABLE_NINF ]b4_table_ninf[ + #define yytable_value_is_error(Yytable_value) \ ]b4_table_value_equals([[table]], [[Yytable_value]], [b4_table_ninf])[ -static const ]b4_int_type_for([b4_check])[ yycheck[] = -{ - ]b4_check[ -}; +]b4_parser_tables_define[ -/* 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[ -}; +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. However, - YYFAIL appears to be in use. Nevertheless, it is formally deprecated - in Bison 2.4.2's NEWS entry, where a plan to phase it out is - discussed. */ - -#define YYFAIL goto yyerrlab -#if defined YYFAIL - /* This is here to suppress warnings from the GCC cpp's - -Wunused-macros. Normally we don't worry about that warning, but - some users do, and we want to make it easy for users to remove - YYFAIL uses, which will produce warnings from Bison 2.5. */ -#endif #define YYRECOVERING() (!!yyerrstatus) @@@ -672,13 -774,13 +672,13 @@@ d else \ { \ yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) + YYERROR; \ + } \ +while (0) /* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 +#define YYTERROR 1 +#define YYERRCODE 256 ]b4_locations_if([[ ]b4_yylloc_default_define[ @@@ -690,7 -792,7 +690,7 @@@ #ifdef YYLEX_PARAM # define YYLEX yylex (]b4_pure_if([&yylval[]b4_locations_if([, &yylloc]), ])[YYLEX_PARAM) #else -# define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[ +# define YYLEX ]b4_function_call([yylex], [int], b4_lex_param)[ #endif /* Enable debugging if requested. */ @@@ -701,33 -803,33 +701,33 @@@ # define YYFPRINTF fprintf # endif -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value]b4_locations_if([, Location])[]b4_user_args[); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - -]b4_yy_symbol_print_generate([b4_c_function_def])[ +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value]b4_locations_if([, Location])[]b4_user_args[); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +]b4_yy_symbol_print_define[ /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ -]b4_c_function_def([yy_stack_print], [static void], - [[yytype_int16 *yybottom], [yybottom]], - [[yytype_int16 *yytop], [yytop]])[ +]b4_function_define([yy_stack_print], [static void], + [[yytype_int16 *yybottom], [yybottom]], + [[yytype_int16 *yytop], [yytop]])[ { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) @@@ -738,47 -840,45 +738,47 @@@ YYFPRINTF (stderr, "\n"); } -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ -]b4_c_function_def([yy_reduce_print], [static void], - [[YYSTYPE *yyvsp], [yyvsp]], +]b4_function_define([yy_reduce_print], [static void], + [[yytype_int16 *yyssp], [yyssp]], + [[YYSTYPE *yyvsp], [yyvsp]], b4_locations_if([[[YYLTYPE *yylsp], [yylsp]], - ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [, - b4_parse_param]))[ + ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [, + b4_parse_param]))[ { + unsigned long int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; - unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); + yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &]b4_rhs_value(yynrhs, yyi + 1)[ - ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl - b4_user_args[); + yy_symbol_print (stderr, + yystos[yyssp[yyi + 1 - yynrhs]], + &]b4_rhs_value(yynrhs, yyi + 1)[ + ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl + b4_user_args[); YYFPRINTF (stderr, "\n"); } } -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \ -} while (YYID (0)) +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \ +} while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ @@@ -792,7 -892,7 +792,7 @@@ int yydebug /* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH +#ifndef YYINITDEPTH # define YYINITDEPTH ]b4_stack_depth_init[ #endif @@@ -912,7 -1012,7 +912,7 @@@ do goto yyerrlab; \ } \ } \ -} while (YYID (0)) +} while (0) /* Discard any previous initial lookahead context because of Event, which may be a lookahead change or an invalidation of the currently @@@ -935,7 -1035,7 +935,7 @@@ do Event "\n"); \ yy_lac_established = 0; \ } \ -} while (YYID (0)) +} while (0) #else # define YY_LAC_DISCARD(Event) yy_lac_established = 0 #endif @@@ -1051,7 -1151,7 +1051,7 @@@ yy_lac (yytype_int16 *yyesa, yytype_int # define yystrlen strlen # else /* Return the length of YYSTR. */ -]b4_c_function_def([yystrlen], [static YYSIZE_T], +]b4_function_define([yystrlen], [static YYSIZE_T], [[const char *yystr], [yystr]])[ { YYSIZE_T yylen; @@@ -1068,7 -1168,7 +1068,7 @@@ # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ -]b4_c_function_def([yystpcpy], [static char *], +]b4_function_define([yystpcpy], [static char *], [[char *yydest], [yydest]], [[const char *yysrc], [yysrc]])[ { char *yyd = yydest; @@@ -1099,27 -1199,27 +1099,27 @@@ yytnamerr (char *yyres, const char *yys char const *yyp = yystr; for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } do_not_strip_quotes: ; } @@@ -1147,7 -1247,6 +1147,6 @@@ yysyntax_error (YYSIZE_T *yymsg_alloc, { YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]); YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ const char *yyformat = YY_NULL; @@@ -1158,6 -1257,10 +1157,6 @@@ int yycount = 0; /* There are many possibilities here to consider: - - Assume YYFAIL is not used. It's too flawed to consider. See - - for details. YYERROR is fine as it does not invoke this - function. - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected @@@ -1224,11 -1327,13 +1223,13 @@@ break; } yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]); - if (! (yysize <= yysize1 - && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; + { + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } } }]b4_lac_if([[ # if ]b4_api_PREFIX[DEBUG @@@ -1252,10 -1357,12 +1253,12 @@@ # undef YYCASE_ } - yysize1 = yysize + yystrlen (yyformat); - if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; + { + YYSIZE_T yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } if (*yymsg_alloc < yysize) { @@@ -1288,7 -1395,7 +1291,7 @@@ } #endif /* YYERROR_VERBOSE */ -]b4_yydestruct_generate([b4_c_function_def])[ +]b4_yydestruct_define[ ]b4_pure_if([], [ @@@ -1303,13 -1410,13 +1306,13 @@@ struct yypstat static char yypstate_allocated = 0;]])b4_pull_if([ -b4_c_function_def([[yyparse]], [[int]], b4_parse_param)[ +b4_function_define([[yyparse]], [[int]], b4_parse_param)[ { return yypull_parse (YY_NULL]m4_ifset([b4_parse_param], - [[, ]b4_c_args(b4_parse_param)])[); + [[, ]b4_args(b4_parse_param)])[); } -]b4_c_function_def([[yypull_parse]], [[int]], +]b4_function_define([[yypull_parse]], [[int]], [[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [, b4_parse_param]))[ { @@@ -1335,7 -1442,7 +1338,7 @@@ do { yychar = YYLEX; yystatus = - yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])[); + yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_args(b4_parse_param)])[); } while (yystatus == YYPUSH_MORE); if (!yyps) yypstate_delete (yyps_local); @@@ -1343,7 -1450,7 +1346,7 @@@ }]])[ /* Initialize the parser data structure. */ -]b4_c_function_def([[yypstate_new]], [[yypstate *]])[ +]b4_function_define([[yypstate_new]], [[yypstate *]])[ { yypstate *yyps;]b4_pure_if([], [[ if (yypstate_allocated) @@@ -1356,7 -1463,7 +1359,7 @@@ return yyps; } -]b4_c_function_def([[yypstate_delete]], [[void]], +]b4_function_define([[yypstate_delete]], [[void]], [[[yypstate *yyps]], [[yyps]]])[ { #ifndef yyoverflow @@@ -1394,7 -1501,7 +1397,7 @@@ | yypush_parse. | `---------------*/ -]b4_c_function_def([[yypush_parse]], [[int]], +]b4_function_define([[yypush_parse]], [[int]], [[[yypstate *yyps]], [[yyps]]]b4_pure_if([, [[[int yypushed_char]], [[yypushed_char]]], [[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([, @@@ -1406,7 -1513,12 +1409,7 @@@ | yyparse. | `----------*/ -#ifdef YYPARSE_PARAM -]b4_c_function_def([yyparse], [int], - [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[ -#else /* ! YYPARSE_PARAM */ -]b4_c_function_def([yyparse], [int], b4_parse_param)[ -#endif]])[ +]b4_function_define([yyparse], [int], b4_parse_param)])[ {]b4_pure_if([b4_declare_scanner_communication_variables ])b4_push_if([b4_pure_if([], [[ int yypushed_char = yychar; @@@ -1490,26 -1602,26 +1493,26 @@@ b4_locations_if([[ yylsp[0] = ]b4_push #ifdef yyoverflow { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss;]b4_locations_if([ - YYLTYPE *yyls1 = yyls;])[ - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp),]b4_locations_if([ - &yyls1, yysize * sizeof (*yylsp),])[ - &yystacksize); + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss;]b4_locations_if([ + YYLTYPE *yyls1 = yyls;])[ + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp),]b4_locations_if([ + &yyls1, yysize * sizeof (*yylsp),])[ + &yystacksize); ]b4_locations_if([ - yyls = yyls1;])[ - yyss = yyss1; - yyvs = yyvs1; + yyls = yyls1;])[ + yyss = yyss1; + yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE @@@ -1517,23 -1629,23 +1520,23 @@@ # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; + yystacksize = YYMAXDEPTH; { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([ - YYSTACK_RELOCATE (yyls_alloc, yyls);])[ + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([ + YYSTACK_RELOCATE (yyls_alloc, yyls);])[ # undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ @@@ -1543,10 -1655,10 +1546,10 @@@ yylsp = yyls + yysize - 1;])[ YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); + (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) - YYABORT; + YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); @@@ -1728,9 -1840,9 +1731,9 @@@ yyreduce goto yynewstate; -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ @@@ -1784,20 -1896,20 +1787,20 @@@ if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an - error, discard it. */ + error, discard it. */ if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } else - { - yydestruct ("Error: discarding", - yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[); - yychar = YYEMPTY; - } + { + yydestruct ("Error: discarding", + yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[); + yychar = YYEMPTY; + } } /* Else will try to reuse lookahead token after shifting the error @@@ -1830,29 -1942,29 +1833,29 @@@ yyerrorlab | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) - YYABORT; + YYABORT; ]b4_locations_if([[ yyerror_range[1] = *yylsp;]])[ yydestruct ("Error: popping", - yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[); + yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); @@@ -1919,7 -2031,7 +1922,7 @@@ yyreturn while (yyssp != yyss) { yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[); + yystos[*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[); YYPOPSTACK (1); } #ifndef yyoverflow @@@ -1935,15 -2047,19 +1938,15 @@@ yypushreturn:]]) if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif - /* Make sure YYID is used. */ - return YYID (yyresult); + return yyresult; } - - ]b4_epilogue[]dnl b4_output_end() b4_defines_if( [b4_output_begin([b4_spec_defines_file])[ -]b4_copyright([Bison interface for Yacc-like parsers in C], - [1984, 1989-1990, 2000-2012])[ +]b4_copyright([Bison interface for Yacc-like parsers in C])[ ]b4_shared_declarations[ ]b4_output_end() -]) +])# b4_defines_if diff --combined src/ielr.c index 39e9cb66,e6aa6f5c..997ba13a --- a/src/ielr.c +++ b/src/ielr.c @@@ -758,8 -758,8 +758,8 @@@ ielr_compute_state (bitsetv follow_kern if (!bitset_empty_p (lookaheads[i])) break; } - // bitset_equal_p uses the size of the first argument, so - // lookaheads[i] must be the second argument. + /* bitset_equal_p uses the size of the first argument, + so lookaheads[i] must be the second argument. */ else if (!bitset_equal_p ((*this_isocorep)->lookaheads[i], lookaheads[i])) break; @@@ -1095,11 -1095,11 +1095,11 @@@ ielr (void /* Examine user options. */ { char *type = muscle_percent_define_get ("lr.type"); - if (0 == strcmp (type, "lalr")) + if (STREQ (type, "lalr")) lr_type = LR_TYPE__LALR; - else if (0 == strcmp (type, "ielr")) + else if (STREQ (type, "ielr")) lr_type = LR_TYPE__IELR; - else if (0 == strcmp (type, "canonical-lr")) + else if (STREQ (type, "canonical-lr")) lr_type = LR_TYPE__CANONICAL_LR; else aver (false); @@@ -1187,8 -1187,8 +1187,8 @@@ free (to_state); if (lr_type == LR_TYPE__CANONICAL_LR) { - // Reduction lookaheads are computed in ielr_split_states above but are - // timed as part of phase 4. + /* Reduction lookaheads are computed in ielr_split_states above + but are timed as part of phase 4. */ set_goto_map (); } else diff --combined src/scan-gram.l index e6f42ea9,9083dce3..d02b26bb --- a/src/scan-gram.l +++ b/src/scan-gram.l @@@ -17,7 -17,7 +17,7 @@@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -%option debug nodefault noinput nounput noyywrap never-interactive +%option debug nodefault noinput noyywrap never-interactive %option prefix="gram_" outfile="lex.yy.c" %{ @@@ -27,26 -27,25 +27,26 @@@ #define gram_wrap() 1 #define FLEX_PREFIX(Id) gram_ ## Id -#include "flex-scanner.h" +#include -#include "complain.h" -#include "files.h" -#include "gram.h" -#include "quotearg.h" -#include "reader.h" -#include "uniqstr.h" +#include +#include +#include +#include +#include +#include +#include #include #include #include -#include "scan-gram.h" +#include #define YY_DECL GRAM_LEX_DECL -#define YY_USER_INIT \ - code_start = scanner_cursor = loc->start; \ +#define YY_USER_INIT \ + code_start = scanner_cursor = loc->start; \ /* Location of scanner cursor. */ static boundary scanner_cursor; @@@ -56,35 -55,12 +56,35 @@@ static size_t no_cr_read (FILE *, char *, size_t); #define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size)) +#define RETURN_PERCENT_PARAM(Value) \ + RETURN_VALUE(PERCENT_PARAM, param, param_ ## Value) + +#define RETURN_PERCENT_FLAG(Value) \ + RETURN_VALUE(PERCENT_FLAG, uniqstr, uniqstr_new (Value)) + +#define RETURN_VALUE(Token, Field, Value) \ + do { \ + val->Field = Value; \ + return Token; \ + } while (0) + #define ROLLBACK_CURRENT_TOKEN \ do { \ - scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0); \ + scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0); \ yyless (0); \ } while (0) +#define DEPRECATED(Msg) \ + do { \ + size_t i; \ + complain (loc, Wdeprecated, \ + _("deprecated directive: %s, use %s"), \ + quote (yytext), quote_n (1, Msg)); \ + scanner_cursor.column -= mbsnwidth (Msg, strlen (Msg), 0); \ + for (i = strlen (Msg); i != 0; --i) \ + unput (Msg[i - 1]); \ + } while (0) + /* A string representing the most recently saved token. */ static char *last_string; @@@ -114,15 -90,12 +114,15 @@@ static void unexpected_newline (boundar /* A identifier was just read in directives/rules. Special state to capture the sequence 'identifier :'. */ %x SC_AFTER_IDENTIFIER + /* A complex tag, with nested angles brackets. */ +%x SC_TAG - /* Three types of user code: + /* Four types of user code: - prologue (code between '%{' '%}' in the first section, before %%); - actions, printers, union, etc, (between braced in the middle section); - - epilogue (everything after the second %%). */ -%x SC_PROLOGUE SC_BRACED_CODE SC_EPILOGUE + - epilogue (everything after the second %%). + - predicate (code between '%?{' and '{' in middle section); */ +%x SC_PROLOGUE SC_BRACED_CODE SC_EPILOGUE SC_PREDICATE /* C and C++ comments in code. */ %x SC_COMMENT SC_LINE_COMMENT /* Strings and characters in code. */ @@@ -130,31 -103,24 +130,31 @@@ /* Bracketed identifiers support. */ %x SC_BRACKETED_ID SC_RETURN_BRACKETED_ID -letter [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_] +letter [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_] notletter [^.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]{-}[%\{] -id {letter}({letter}|[-0-9])* -int [0-9]+ +id {letter}({letter}|[-0-9])* +int [0-9]+ /* POSIX says that a tag must be both an id and a C union member, but historically almost any character is allowed in a tag. We disallow - NUL and newline, as this simplifies our implementation. */ -tag [^\0\n>]+ + NUL, as this simplifies our implementation. We disallow angle + bracket to match them in nested pairs: several languages use them + for generics/template types. */ +tag [^\0<>]+ /* Zero or more instances of backslash-newline. Following GCC, allow white space between the backslash and the newline. */ -splice (\\[ \f\t\v]*\n)* +splice (\\[ \f\t\v]*\n)* + +/* An equal sign, with optional leading whitespaces. This is used in some + deprecated constructs. */ +eqopt ([[:space:]]*=)? %% %{ - /* Nesting level of the current code in braces. */ - int braces_level PACIFY_CC (= 0); + /* Nesting level. Either for nested braces, or nested angle brackets + (but not mixed). */ + int nesting PACIFY_CC (= 0); /* Parent context state, when applicable. */ int context_state PACIFY_CC (= 0); @@@ -180,9 -146,7 +180,9 @@@ { /* Comments and white space. */ - "," warn_at (*loc, _("stray ',' treated as white space")); + "," { + complain (loc, Wother, _("stray ',' treated as white space")); + } [ \f\n\t\v] | "//".* continue; "/*" { @@@ -204,7 -168,7 +204,7 @@@ `----------------------------*/ /* For directives that are also command line options, the regex must be - "%..." + "%..." after "[-_]"s are removed, and the directive must match the --long option name, with a single string argument. Otherwise, add exceptions to ../build-aux/cross-options.pl. */ @@@ -213,69 -177,56 +213,69 @@@ { "%binary" return PERCENT_NONASSOC; "%code" return PERCENT_CODE; - "%debug" return PERCENT_DEBUG; - "%default"[-_]"prec" return PERCENT_DEFAULT_PREC; + "%debug" RETURN_PERCENT_FLAG("parse.trace"); + "%default-prec" return PERCENT_DEFAULT_PREC; "%define" return PERCENT_DEFINE; "%defines" return PERCENT_DEFINES; "%destructor" return PERCENT_DESTRUCTOR; "%dprec" return PERCENT_DPREC; - "%error"[-_]"verbose" return PERCENT_ERROR_VERBOSE; + "%error-verbose" return PERCENT_ERROR_VERBOSE; "%expect" return PERCENT_EXPECT; - "%expect"[-_]"rr" return PERCENT_EXPECT_RR; + "%expect-rr" return PERCENT_EXPECT_RR; "%file-prefix" return PERCENT_FILE_PREFIX; - "%fixed"[-_]"output"[-_]"files" return PERCENT_YACC; + "%fixed-output-files" return PERCENT_YACC; "%initial-action" return PERCENT_INITIAL_ACTION; "%glr-parser" return PERCENT_GLR_PARSER; "%language" return PERCENT_LANGUAGE; "%left" return PERCENT_LEFT; - "%lex-param" return PERCENT_LEX_PARAM; - "%locations" return PERCENT_LOCATIONS; + "%lex-param" RETURN_PERCENT_PARAM(lex); + "%locations" RETURN_PERCENT_FLAG("locations"); "%merge" return PERCENT_MERGE; - "%name"[-_]"prefix" return PERCENT_NAME_PREFIX; - "%no"[-_]"default"[-_]"prec" return PERCENT_NO_DEFAULT_PREC; - "%no"[-_]"lines" return PERCENT_NO_LINES; + "%name-prefix" return PERCENT_NAME_PREFIX; + "%no-default-prec" return PERCENT_NO_DEFAULT_PREC; + "%no-lines" return PERCENT_NO_LINES; "%nonassoc" return PERCENT_NONASSOC; "%nondeterministic-parser" return PERCENT_NONDETERMINISTIC_PARSER; "%nterm" return PERCENT_NTERM; "%output" return PERCENT_OUTPUT; - "%parse-param" return PERCENT_PARSE_PARAM; + "%param" RETURN_PERCENT_PARAM(both); + "%parse-param" RETURN_PERCENT_PARAM(parse); "%prec" return PERCENT_PREC; + "%precedence" return PERCENT_PRECEDENCE; "%printer" return PERCENT_PRINTER; - "%pure"[-_]"parser" return PERCENT_PURE_PARSER; + "%pure-parser" RETURN_PERCENT_FLAG("api.pure"); "%require" return PERCENT_REQUIRE; "%right" return PERCENT_RIGHT; "%skeleton" return PERCENT_SKELETON; "%start" return PERCENT_START; "%term" return PERCENT_TOKEN; "%token" return PERCENT_TOKEN; - "%token"[-_]"table" return PERCENT_TOKEN_TABLE; + "%token-table" return PERCENT_TOKEN_TABLE; "%type" return PERCENT_TYPE; "%union" return PERCENT_UNION; "%verbose" return PERCENT_VERBOSE; "%yacc" return PERCENT_YACC; + /* deprecated */ + "%default"[-_]"prec" DEPRECATED("%default-prec"); + "%error"[-_]"verbose" DEPRECATED("%define parse.error verbose"); + "%expect"[-_]"rr" DEPRECATED("%expect-rr"); + "%file-prefix"{eqopt} DEPRECATED("%file-prefix"); + "%fixed"[-_]"output"[-_]"files" DEPRECATED("%fixed-output-files"); + "%name"[-_]"prefix"{eqopt} DEPRECATED("%name-prefix"); + "%no"[-_]"default"[-_]"prec" DEPRECATED("%no-default-prec"); + "%no"[-_]"lines" DEPRECATED("%no-lines"); + "%output"{eqopt} DEPRECATED("%output"); + "%pure"[-_]"parser" DEPRECATED("%pure-parser"); + "%token"[-_]"table" DEPRECATED("%token-table"); + "%"{id}|"%"{notletter}([[:graph:]])+ { - complain_at (*loc, _("invalid directive: %s"), quote (yytext)); + complain (loc, complaint, _("invalid directive: %s"), quote (yytext)); } "=" return EQUAL; "|" return PIPE; ";" return SEMICOLON; - "<*>" return TYPE_TAG_ANY; - "<>" return TYPE_TAG_NONE; {id} { val->uniqstr = uniqstr_new (yytext); @@@ -296,14 -247,14 +296,14 @@@ /* Identifiers may not start with a digit. Yet, don't silently accept "1FOO" as "1 FOO". */ {int}{id} { - complain_at (*loc, _("invalid identifier: %s"), quote (yytext)); + complain (loc, complaint, _("invalid identifier: %s"), quote (yytext)); } /* Characters. */ - "'" token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; + "'" token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; /* Strings. */ - "\"" token_start = loc->start; BEGIN SC_ESCAPED_STRING; + "\"" token_start = loc->start; BEGIN SC_ESCAPED_STRING; /* Prologue. */ "%{" code_start = loc->start; BEGIN SC_PROLOGUE; @@@ -311,32 -262,18 +311,32 @@@ /* Code in between braces. */ "{" { STRING_GROW; - braces_level = 0; + nesting = 0; code_start = loc->start; BEGIN SC_BRACED_CODE; } + /* Semantic predicate. */ + "%?"[ \f\n\t\v]*"{" { + nesting = 0; + code_start = loc->start; + BEGIN SC_PREDICATE; + } + /* A type. */ + "<*>" return TAG_ANY; + "<>" return TAG_NONE; "<"{tag}">" { obstack_grow (&obstack_for_string, yytext + 1, yyleng - 2); STRING_FINISH; val->uniqstr = uniqstr_new (last_string); STRING_FREE; - return TYPE; + return TAG; + } + "<" { + nesting = 0; + token_start = loc->start; + BEGIN SC_TAG; } "%%" { @@@ -354,9 -291,9 +354,9 @@@ } [^\[%A-Za-z0-9_<>{}\"\'*;|=/, \f\n\t\v]+|. { - complain_at (*loc, "%s: %s", - ngettext ("invalid character", "invalid characters", yyleng), - quote_mem (yytext, yyleng)); + complain (loc, complaint, "%s: %s", + ngettext ("invalid character", "invalid characters", yyleng), + quote_mem (yytext, yyleng)); } <> { @@@ -366,17 -303,6 +366,17 @@@ } + /*--------------------------------------------------------------. + | Supporting \0 complexifies our implementation for no expected | + | added value. | + `--------------------------------------------------------------*/ + + +{ + \0 complain (loc, complaint, _("invalid null character")); +} + + /*-----------------------------------------------------------------. | Scanning after an identifier, checking whether a colon is next. | `-----------------------------------------------------------------*/ @@@ -386,16 -312,16 +386,16 @@@ "[" { if (bracketed_id_str) { - ROLLBACK_CURRENT_TOKEN; - BEGIN SC_RETURN_BRACKETED_ID; - *loc = id_loc; - return ID; + ROLLBACK_CURRENT_TOKEN; + BEGIN SC_RETURN_BRACKETED_ID; + *loc = id_loc; + return ID; } else { - bracketed_id_start = loc->start; - bracketed_id_context_state = YY_START; - BEGIN SC_BRACKETED_ID; + bracketed_id_start = loc->start; + bracketed_id_context_state = YY_START; + BEGIN SC_BRACKETED_ID; } } ":" { @@@ -425,37 -351,36 +425,37 @@@ {id} { if (bracketed_id_str) { - complain_at (*loc, _("unexpected identifier in bracketed name: %s"), - quote (yytext)); + complain (loc, complaint, + _("unexpected identifier in bracketed name: %s"), + quote (yytext)); } else { - bracketed_id_str = uniqstr_new (yytext); - bracketed_id_loc = *loc; + bracketed_id_str = uniqstr_new (yytext); + bracketed_id_loc = *loc; } } "]" { BEGIN bracketed_id_context_state; if (bracketed_id_str) { - if (INITIAL == bracketed_id_context_state) - { - val->uniqstr = bracketed_id_str; - bracketed_id_str = 0; - *loc = bracketed_id_loc; - return BRACKETED_ID; - } + if (INITIAL == bracketed_id_context_state) + { + val->uniqstr = bracketed_id_str; + bracketed_id_str = 0; + *loc = bracketed_id_loc; + return BRACKETED_ID; + } } else - complain_at (*loc, _("an identifier expected")); + complain (loc, complaint, _("an identifier expected")); } [^\].A-Za-z0-9_/ \f\n\t\v]+|. { - complain_at (*loc, "%s: %s", - ngettext ("invalid character in bracketed name", - "invalid characters in bracketed name", yyleng), - quote_mem (yytext, yyleng)); + complain (loc, complaint, "%s: %s", + ngettext ("invalid character in bracketed name", + "invalid characters in bracketed name", yyleng), + quote_mem (yytext, yyleng)); } <> { @@@ -484,7 -409,7 +484,7 @@@ { "*/" BEGIN context_state; - .|\n continue; + .|\n continue; <> unexpected_eof (token_start, "*/"); BEGIN context_state; } @@@ -496,7 -421,7 +496,7 @@@ { "*"{splice}"/" STRING_GROW; BEGIN context_state; - <> unexpected_eof (token_start, "*/"); BEGIN context_state; + <> unexpected_eof (token_start, "*/"); BEGIN context_state; } @@@ -506,9 -431,9 +506,9 @@@ { - "\n" STRING_GROW; BEGIN context_state; - {splice} STRING_GROW; - <> BEGIN context_state; + "\n" STRING_GROW; BEGIN context_state; + {splice} STRING_GROW; + <> BEGIN context_state; } @@@ -540,7 -465,7 +540,7 @@@ /*----------------------------------------------------------. | Scanning a Bison character literal, decoding its escapes. | - | The initial quote is already eaten. | + | The initial quote is already eaten. | `----------------------------------------------------------*/ @@@ -553,13 -478,12 +553,13 @@@ /* FIXME: Eventually, make these errors. */ if (last_string[0] == '\0') { - warn_at (*loc, _("empty character literal")); + complain (loc, Wother, _("empty character literal")); /* '\0' seems dangerous even if we are about to complain. */ val->character = '\''; } else if (last_string[1] != '\0') - warn_at (*loc, _("extra characters in character literal")); + complain (loc, Wother, + _("extra characters in character literal")); } if (yytext[0] == '\n') unexpected_newline (token_start, "'"); @@@ -575,13 -499,12 +575,13 @@@ /* FIXME: Eventually, make these errors. */ if (last_string[0] == '\0') { - warn_at (*loc, _("empty character literal")); + complain (loc, Wother, _("empty character literal")); /* '\0' seems dangerous even if we are about to complain. */ val->character = '\''; } else if (last_string[1] != '\0') - warn_at (*loc, _("extra characters in character literal")); + complain (loc, Wother, + _("extra characters in character literal")); } unexpected_eof (token_start, "'"); STRING_FREE; @@@ -590,40 -513,11 +590,40 @@@ } } - + /*-----------------------------------------------------------. + | Scanning a Bison nested tag. The initial angle bracket is | + | already eaten. | + `-----------------------------------------------------------*/ + + { - \0 complain_at (*loc, _("invalid null character")); -} + ">" { + --nesting; + if (nesting < 0) + { + STRING_FINISH; + loc->start = token_start; + val->uniqstr = uniqstr_new (last_string); + STRING_FREE; + BEGIN INITIAL; + return TAG; + } + STRING_GROW; + } + [^<>]+ STRING_GROW; + "<"+ STRING_GROW; nesting += yyleng; + + <> { + unexpected_eof (token_start, ">"); + STRING_FINISH; + loc->start = token_start; + val->uniqstr = uniqstr_new (last_string); + STRING_FREE; + BEGIN INITIAL; + return TAG; + } +} /*----------------------------. | Decode escaped characters. | @@@ -634,7 -528,7 +634,7 @@@ \\[0-7]{1,3} { unsigned long int c = strtoul (yytext + 1, NULL, 8); if (!c || UCHAR_MAX < c) - complain_at (*loc, _("invalid number after \\-escape: %s"), + complain (loc, complaint, _("invalid number after \\-escape: %s"), yytext+1); else obstack_1grow (&obstack_for_string, c); @@@ -644,19 -538,19 +644,19 @@@ verify (UCHAR_MAX < ULONG_MAX); unsigned long int c = strtoul (yytext + 2, NULL, 16); if (!c || UCHAR_MAX < c) - complain_at (*loc, _("invalid number after \\-escape: %s"), + complain (loc, complaint, _("invalid number after \\-escape: %s"), yytext+1); else obstack_1grow (&obstack_for_string, c); } - \\a obstack_1grow (&obstack_for_string, '\a'); - \\b obstack_1grow (&obstack_for_string, '\b'); - \\f obstack_1grow (&obstack_for_string, '\f'); - \\n obstack_1grow (&obstack_for_string, '\n'); - \\r obstack_1grow (&obstack_for_string, '\r'); - \\t obstack_1grow (&obstack_for_string, '\t'); - \\v obstack_1grow (&obstack_for_string, '\v'); + \\a obstack_1grow (&obstack_for_string, '\a'); + \\b obstack_1grow (&obstack_for_string, '\b'); + \\f obstack_1grow (&obstack_for_string, '\f'); + \\n obstack_1grow (&obstack_for_string, '\n'); + \\r obstack_1grow (&obstack_for_string, '\r'); + \\t obstack_1grow (&obstack_for_string, '\t'); + \\v obstack_1grow (&obstack_for_string, '\v'); /* \\[\"\'?\\] would be shorter, but it confuses xgettext. */ \\("\""|"'"|"?"|"\\") obstack_1grow (&obstack_for_string, yytext[1]); @@@ -664,20 -558,19 +664,20 @@@ \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} { int c = convert_ucn_to_byte (yytext); if (c <= 0) - complain_at (*loc, _("invalid number after \\-escape: %s"), + complain (loc, complaint, _("invalid number after \\-escape: %s"), yytext+1); else obstack_1grow (&obstack_for_string, c); } - \\(.|\n) { + \\(.|\n) { char const *p = yytext + 1; /* Quote only if escaping won't make the character visible. */ if (c_isspace ((unsigned char) *p) && c_isprint ((unsigned char) *p)) p = quote (p); else p = quotearg_style_mem (escape_quoting_style, p, 1); - complain_at (*loc, _("invalid character after \\-escape: %s"), p); + complain (loc, complaint, _("invalid character after \\-escape: %s"), + p); } } @@@ -687,21 -580,21 +687,21 @@@ { - {splice}|\\{splice}[^\n\[\]] STRING_GROW; + {splice}|\\{splice}[^\n\[\]] STRING_GROW; } { - "'" STRING_GROW; BEGIN context_state; - \n unexpected_newline (token_start, "'"); BEGIN context_state; - <> unexpected_eof (token_start, "'"); BEGIN context_state; + "'" STRING_GROW; BEGIN context_state; + \n unexpected_newline (token_start, "'"); BEGIN context_state; + <> unexpected_eof (token_start, "'"); BEGIN context_state; } { - "\"" STRING_GROW; BEGIN context_state; - \n unexpected_newline (token_start, "\""); BEGIN context_state; - <> unexpected_eof (token_start, "\""); BEGIN context_state; + "\"" STRING_GROW; BEGIN context_state; + \n unexpected_newline (token_start, "\""); BEGIN context_state; + <> unexpected_eof (token_start, "\""); BEGIN context_state; } @@@ -709,7 -602,7 +709,7 @@@ | Strings, comments etc. can be found in user code. | `---------------------------------------------------*/ - + { "'" { STRING_GROW; @@@ -739,63 -632,42 +739,63 @@@ /*-----------------------------------------------------------. - | Scanning some code in braces (actions). The initial "{" is | - | already eaten. | + | Scanning some code in braces (actions, predicates). The | + | initial "{" is already eaten. | `-----------------------------------------------------------*/ - + { - "{"|"<"{splice}"%" STRING_GROW; braces_level++; - "%"{splice}">" STRING_GROW; braces_level--; - "}" { - obstack_1grow (&obstack_for_string, '}'); - - --braces_level; - if (braces_level < 0) - { - STRING_FINISH; - loc->start = code_start; - val->code = last_string; - BEGIN INITIAL; - return BRACED_CODE; - } - } + "{"|"<"{splice}"%" STRING_GROW; nesting++; + "%"{splice}">" STRING_GROW; nesting--; /* Tokenize '<<%' correctly (as '<<' '%') rather than incorrrectly (as '<' '<%'). */ "<"{splice}"<" STRING_GROW; <> { + int token = (YY_START == SC_BRACED_CODE) ? BRACED_CODE : BRACED_PREDICATE; unexpected_eof (code_start, "}"); STRING_FINISH; loc->start = code_start; val->code = last_string; BEGIN INITIAL; - return BRACED_CODE; + return token; } } + +{ + "}" { + obstack_1grow (&obstack_for_string, '}'); + + --nesting; + if (nesting < 0) + { + STRING_FINISH; + loc->start = code_start; + val->code = last_string; + BEGIN INITIAL; + return BRACED_CODE; + } + } +} + + +{ + "}" { + --nesting; + if (nesting < 0) + { + STRING_FINISH; + loc->start = code_start; + val->code = last_string; + BEGIN INITIAL; + return BRACED_PREDICATE; + } + else + obstack_1grow (&obstack_for_string, '}'); + } +} /*--------------------------------------------------------------. | Scanning some prologue: from "%{" (already scanned) to "%}". | @@@ -843,8 -715,8 +843,8 @@@ | By default, grow the string obstack with the input. | `-----------------------------------------------------*/ -. | -\n STRING_GROW; +. | + \n STRING_GROW; %% @@@ -860,35 -732,35 +860,35 @@@ no_cr_read (FILE *fp, char *buf, size_ { char *w = memchr (buf, '\r', bytes_read); if (w) - { - char const *r = ++w; - char const *lim = buf + bytes_read; - - for (;;) - { - /* Found an '\r'. Treat it like '\n', but ignore any - '\n' that immediately follows. */ - w[-1] = '\n'; - if (r == lim) - { - int ch = getc (fp); - if (ch != '\n' && ungetc (ch, fp) != ch) - break; - } - else if (*r == '\n') - r++; - - /* Copy until the next '\r'. */ - do - { - if (r == lim) - return w - buf; - } - while ((*w++ = *r++) != '\r'); - } - - return w - buf; - } + { + char const *r = ++w; + char const *lim = buf + bytes_read; + + for (;;) + { + /* Found an '\r'. Treat it like '\n', but ignore any + '\n' that immediately follows. */ + w[-1] = '\n'; + if (r == lim) + { + int ch = getc (fp); + if (ch != '\n' && ungetc (ch, fp) != ch) + break; + } + else if (*r == '\n') + r++; + + /* Copy until the next '\r'. */ + do + { + if (r == lim) + return w - buf; + } + while ((*w++ = *r++) != '\r'); + } + + return w - buf; + } } return bytes_read; @@@ -908,8 -780,7 +908,8 @@@ scan_integer (char const *number, int b if (INT_MAX < num) { - complain_at (loc, _("integer out of range: %s"), quote (number)); + complain (&loc, complaint, _("integer out of range: %s"), + quote (number)); num = INT_MAX; } @@@ -920,7 -791,7 +920,7 @@@ /*------------------------------------------------------------------. | Convert universal character name UCN to a single-byte character, | | and return that character. Return -1 if UCN does not correspond | -| to a single-byte character. | +| to a single-byte character. | `------------------------------------------------------------------*/ static int @@@ -948,22 -819,22 +948,22 @@@ convert_ucn_to_byte (char const *ucn about. */ static signed char const table[] = { - '\0', -1, -1, -1, -1, -1, -1, '\a', - '\b', '\t', '\n', '\v', '\f', '\r', -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - ' ', '!', '"', '#', '$', '%', '&', '\'', - '(', ')', '*', '+', ',', '-', '.', '/', - '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', ':', ';', '<', '=', '>', '?', - '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', - 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', - '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', - 'x', 'y', 'z', '{', '|', '}', '~' + '\0', -1, -1, -1, -1, -1, -1, '\a', + '\b', '\t', '\n', '\v', '\f', '\r', -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~' }; code = code < sizeof table ? table[code] : -1; @@@ -985,14 -856,14 +985,14 @@@ handle_syncline (char *args, location l unsigned long int lineno = strtoul (args, &file, 10); if (INT_MAX <= lineno) { - warn_at (loc, _("line number overflow")); + complain (&loc, Wother, _("line number overflow")); lineno = INT_MAX; } - file = mbschr (file, '"'); + file = strchr (file, '"'); if (file) { - *mbschr (file + 1, '"') = '\0'; + *strchr (file + 1, '"') = '\0'; current_file = uniqstr_new (file + 1); } boundary_set (&scanner_cursor, current_file, lineno, 1); @@@ -1001,8 -872,8 +1001,8 @@@ /*----------------------------------------------------------------. | For a token or comment starting at START, report message MSGID, | -| which should say that an end marker was found before | -| the expected TOKEN_END. | +| which should say that an end marker was found before | +| the expected TOKEN_END. | `----------------------------------------------------------------*/ static void @@@ -1012,10 -883,10 +1012,10 @@@ unexpected_end (boundary start, char co loc.start = start; loc.end = scanner_cursor; token_end = quote (token_end); - // Instead of '\'', display "'". + /* Instead of '\'', display "'". */ - if (!strcmp (token_end, "'\\''")) + if (STREQ (token_end, "'\\''")) token_end = "\"'\""; - complain_at (loc, _(msgid), token_end); + complain (&loc, complaint, _(msgid), token_end); } diff --combined src/system.h index 987ebe2a,35ff8764..01cce6dc --- a/src/system.h +++ b/src/system.h @@@ -16,65 -16,51 +16,65 @@@ along with this program. If not, see . */ #ifndef BISON_SYSTEM_H -# define BISON_SYSTEM_H +#define BISON_SYSTEM_H /* flex 2.5.31 gratutiously defines macros like INT8_MIN. But this runs afoul of pre-C99 compilers that have or , which are included below if available. It also runs afoul of pre-C99 compilers that define these macros in . */ -# if ! defined __STDC_VERSION__ || __STDC_VERSION__ < 199901 -# undef INT8_MIN -# undef INT16_MIN -# undef INT32_MIN -# undef INT8_MAX -# undef INT16_MAX -# undef UINT8_MAX -# undef INT32_MAX -# undef UINT16_MAX -# undef UINT32_MAX -# endif +#if ! defined __STDC_VERSION__ || __STDC_VERSION__ < 199901 +# undef INT8_MIN +# undef INT16_MIN +# undef INT32_MIN +# undef INT8_MAX +# undef INT16_MAX +# undef UINT8_MAX +# undef INT32_MAX +# undef UINT16_MAX +# undef UINT32_MAX +#endif + +#include +#include +#include +#include + +#define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array)) +#define STREQ(L, R) (strcmp(L, R) == 0) +#define STRNEQ(L, R) (!STREQ(L, R)) -# include -# include -# include -# include -# include -# include +/* Just like strncmp, but the second argument must be a literal string + and you don't specify the length. */ +#define STRNCMP_LIT(S, Literal) \ + strncmp (S, "" Literal "", sizeof (Literal) - 1) + +/* Whether Literal is a prefix of S. */ +#define STRPREFIX_LIT(Literal, S) \ + (STRNCMP_LIT (S, Literal) == 0) + +#include +#include #define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array)) #define STREQ(L, R) (strcmp(L, R) == 0) #define STRNEQ(L, R) (!STREQ(L, R)) -# ifndef UINTPTR_MAX +#ifndef UINTPTR_MAX /* This isn't perfect, but it's good enough for Bison, which needs only to hash pointers. */ typedef size_t uintptr_t; -# endif +#endif - // Version mismatch. + /* Version mismatch. */ -# define EX_MISMATCH 63 +#define EX_MISMATCH 63 /*---------. | Gnulib. | `---------*/ -# include -# include -# include +#include +#include +#include /*-----------------. @@@ -93,48 -79,48 +93,48 @@@ and safer logic than it would for users. Due to the overhead of M4, suppressing Code is unlikely to offer any significant improvement in Bison's performance anyway. */ -# define PACIFY_CC(Code) Code +#define PACIFY_CC(Code) Code -# ifndef __attribute__ +#ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ -# if (! defined __GNUC__ || __GNUC__ < 2 \ +# if (! defined __GNUC__ || __GNUC__ < 2 \ || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) -# define __attribute__(Spec) /* empty */ -# endif +# define __attribute__(Spec) /* empty */ # endif +#endif /* The __-protected variants of `format' and `printf' attributes are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ -# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) -# define __format__ format -# define __printf__ printf -# endif +#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) +# define __format__ format +# define __printf__ printf +#endif -# ifndef ATTRIBUTE_NORETURN -# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) -# endif +#ifndef ATTRIBUTE_NORETURN +# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) +#endif -# ifndef ATTRIBUTE_UNUSED -# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) -# endif +#ifndef ATTRIBUTE_UNUSED +# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +#endif /*------. | NLS. | `------*/ -# include +#include -# include -# define _(Msgid) gettext (Msgid) -# define N_(Msgid) (Msgid) +#include +#define _(Msgid) gettext (Msgid) +#define N_(Msgid) (Msgid) /*-----------. | Booleans. | `-----------*/ -# include +#include @@@ -160,21 -146,19 +160,21 @@@ For now, we use assert but we call it aver throughout Bison in case we later wish to try another scheme. */ -# include -# define aver assert +#include +#define aver assert /*-----------. | Obstacks. | `-----------*/ -# define obstack_chunk_alloc xmalloc -# define obstack_chunk_free free -# include +#define obstack_chunk_alloc xmalloc +#define obstack_chunk_free free +#include + +/* String-grow: append Str to Obs. */ -# define obstack_sgrow(Obs, Str) \ +#define obstack_sgrow(Obs, Str) \ obstack_grow (Obs, Str, strlen (Str)) /* Output Str escaped for our postprocessing (i.e., escape M4 special @@@ -184,15 -168,15 +184,15 @@@ # define obstack_escape(Obs, Str) \ do { \ - char const *p; \ - for (p = Str; *p; p++) \ - switch (*p) \ + char const *p__; \ + for (p__ = Str; *p__; p__++) \ + switch (*p__) \ { \ case '$': obstack_sgrow (Obs, "$]["); break; \ case '@': obstack_sgrow (Obs, "@@" ); break; \ case '[': obstack_sgrow (Obs, "@{" ); break; \ case ']': obstack_sgrow (Obs, "@}" ); break; \ - default: obstack_1grow (Obs, *p ); break; \ + default: obstack_1grow (Obs, *p__ ); break; \ } \ } while (0) @@@ -228,13 -212,13 +228,13 @@@ | Extensions to use for the output files. | `-----------------------------------------*/ -# ifndef OUTPUT_EXT -# define OUTPUT_EXT ".output" -# endif +#ifndef OUTPUT_EXT +# define OUTPUT_EXT ".output" +#endif -# ifndef TAB_EXT -# define TAB_EXT ".tab" -# endif +#ifndef TAB_EXT +# define TAB_EXT ".tab" +#endif @@@ -242,15 -226,15 +242,15 @@@ | Free a linked list. | `---------------------*/ -# define LIST_FREE(Type, List) \ - do { \ - Type *_node, *_next; \ - for (_node = List; _node; _node = _next) \ - { \ - _next = _node->next; \ - free (_node); \ - } \ - } while (0) +#define LIST_FREE(Type, List) \ +do { \ + Type *_node, *_next; \ + for (_node = List; _node; _node = _next) \ + { \ + _next = _node->next; \ + free (_node); \ + } \ +} while (0) /*---------------------------------------------. diff --combined tests/actions.at index f62c43dd,97c08c29..84e840fa --- a/tests/actions.at +++ b/tests/actions.at @@@ -1,4 -1,4 +1,4 @@@ -# Executing Actions. -*- Autotest -*- +e# Executing Actions. -*- Autotest -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. @@@ -30,7 -30,7 +30,7 @@@ AT_SETUP([Mid-rule actions] AT_BISON_OPTION_PUSHDEFS AT_DATA_GRAMMAR([[input.y]], -[[%error-verbose +[[%define parse.error verbose %debug %{ ]AT_YYERROR_DECLARE[ @@@ -90,7 -90,7 +90,7 @@@ AT_DATA_GRAMMAR([[input.y]] %code { # include - # include // getenv + # include /* getenv */ ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ } @@@ -195,7 -195,7 +195,7 @@@ AT_DATA_GRAMMAR([[input.y]] %code { # include - # include // getenv + # include /* getenv */ ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ } @@@ -223,6 -223,7 +223,7 @@@ main (void TEST(7, 2, 0, 2); TEST(8, 0, 8, 0); + return 0; } ]]) @@@ -257,7 -258,7 +258,7 @@@ AT_SETUP([Exotic Dollars] AT_BISON_OPTION_PUSHDEFS AT_DATA_GRAMMAR([[input.y]], -[[%error-verbose +[[%define parse.error verbose %debug %{ ]AT_YYERROR_DECLARE[ @@@ -313,7 -314,7 +314,7 @@@ AT_PARSER_CHECK([./input], 0 AT_DATA_GRAMMAR([[input.y]], [[ %{ -#include +# include ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ typedef struct { int val; } stype; @@@ -481,7 -482,7 +482,7 @@@ line $$ = -1; V(line, $$, @$, ": "); V('(', $1, @1, " "); - fprintf (stderr, "error (@%d-%d) ", RANGE (@2)); + fprintf (stderr, "error (@%d-%d) ", RANGE(@2)); V(')', $3, @3, "\n"); } ; @@@ -737,7 -738,7 +738,7 @@@ m4_define([AT_CHECK_PRINTER_AND_DESTRUC $3 _AT_CHECK_PRINTER_AND_DESTRUCTOR($[1], $[2], $[3], $[4], -[%error-verbose +[%define parse.error verbose %debug %verbose %locations @@@ -748,13 -749,13 +749,13 @@@ AT_CLEANU AT_CHECK_PRINTER_AND_DESTRUCTOR([]) -AT_CHECK_PRINTER_AND_DESTRUCTOR([], [ with union]) +AT_CHECK_PRINTER_AND_DESTRUCTOR([], [with union]) AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"]) -AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [ with union]) +AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [with union]) AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser]) -AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [ with union]) +AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [with union]) @@@ -768,7 -769,7 +769,7 @@@ AT_SETUP([Default tagless %printer and %destructor]) AT_BISON_OPTION_PUSHDEFS([%locations]) AT_DATA_GRAMMAR([[input.y]], -[[%error-verbose +[[%define parse.error verbose %debug %locations @@@ -818,10 -819,7 +819,10 @@@ main (void } ]]) -AT_BISON_CHECK([-o input.c input.y]) +AT_BISON_CHECK([-o input.c input.y], [], [], +[[input.y:23.3-5: warning: useless %destructor for type <*> [-Wother] +input.y:23.3-5: warning: useless %printer for type <*> [-Wother] +]]) AT_COMPILE([input]) AT_PARSER_CHECK([./input], 1, [[<> destructor for 'd' @ 4. @@@ -869,7 -867,7 +870,7 @@@ AT_CLEANU AT_SETUP([Default tagged and per-type %printer and %destructor]) AT_BISON_OPTION_PUSHDEFS AT_DATA_GRAMMAR([[input.y]], -[[%error-verbose +[[%define parse.error verbose %debug %{ @@@ -933,10 -931,7 +934,10 @@@ main (void } ]]) -AT_BISON_CHECK([-o input.c input.y]) +AT_BISON_CHECK([-o input.c input.y], [], [], +[[input.y:22.3-4: warning: useless %destructor for type <> [-Wother] +input.y:22.3-4: warning: useless %printer for type <> [-Wother] +]]) AT_COMPILE([input]) AT_PARSER_CHECK([./input], 1, [[<*>//e destructor. @@@ -995,16 -990,16 +996,16 @@@ AT_CLEANU AT_SETUP([Default %printer and %destructor for user-defined end token]) -# _AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(TYPED) -# ------------------------------------------------------------- -m4_define([_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN], +# AT_TEST(TYPED) +# -------------- +m4_pushdef([AT_TEST], [m4_if($1, 0, [m4_pushdef([kind], []) m4_pushdef([not_kind], [*])], [m4_pushdef([kind], [*]) m4_pushdef([not_kind], [])]) AT_BISON_OPTION_PUSHDEFS([%locations]) AT_DATA_GRAMMAR([[input]]$1[[.y]], -[[%error-verbose +[[%define parse.error verbose %debug %locations @@@ -1065,17 -1060,8 +1066,17 @@@ main (void ]]) AT_BISON_OPTION_POPDEFS -AT_BISON_CHECK([-o input$1.c input$1.y]) +AT_BISON_CHECK([-o input$1.c input$1.y], [], [], +[m4_if([$1], [0], +[[input0.y:23.3-5: warning: useless %destructor for type <*> [-Wother] +input0.y:23.3-5: warning: useless %printer for type <*> [-Wother] +]], +[[input1.y:23.3-4: warning: useless %destructor for type <> [-Wother] +input1.y:23.3-4: warning: useless %printer for type <> [-Wother] +]])]) + AT_COMPILE([input$1]) + AT_PARSER_CHECK([./input$1], 0, [[<]]kind[[> for 'E' @ 1. <]]kind[[> for 'S' @ 1. @@@ -1098,10 -1084,8 +1099,10 @@@ m4_popdef([kind] m4_popdef([not_kind]) ]) -_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(0) -_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(1) +AT_TEST(0) +AT_TEST(1) + +m4_popdef([AT_TEST]) AT_CLEANUP @@@ -1161,10 -1145,7 +1162,10 @@@ main (void ]]) AT_BISON_OPTION_POPDEFS -AT_BISON_CHECK([-o input.c input.y]) +AT_BISON_CHECK([-o input.c input.y], [], [], +[[input.y:21.6-8: warning: useless %destructor for type <*> [-Wother] +input.y:21.6-8: warning: useless %printer for type <*> [-Wother] +]]) AT_COMPILE([input]) AT_PARSER_CHECK([./input], [1], [], [[Starting parse @@@ -1263,10 -1244,7 +1264,10 @@@ main (void ]]) AT_BISON_OPTION_POPDEFS -AT_BISON_CHECK([-o input.c input.y]) +AT_BISON_CHECK([-o input.c input.y], [], [], +[[input.y:22.3-4: warning: useless %destructor for type <> [-Wother] +input.y:22.3-4: warning: useless %printer for type <> [-Wother] +]]) AT_COMPILE([input]) AT_CLEANUP @@@ -1323,23 -1301,15 +1324,23 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-o input.c input.y], 0,, -[[input.y:33.3-23: warning: unset value: $$ -input.y:32.3-23: warning: unused value: $3 +[[input.y:24.70-72: warning: useless %destructor for type <*> [-Wother] +input.y:24.70-72: warning: useless %printer for type <*> [-Wother] +input.y:33.3-23: warning: unset value: $$ [-Wother] +input.y:32.3-23: warning: unused value: $3 [-Wother] ]]) AT_BISON_CHECK([-fcaret -o input.c input.y], 0,, -[[input.y:33.3-23: warning: unset value: $$ +[[input.y:24.70-72: warning: useless %destructor for type <*> [-Wother] + %printer { fprintf (yyoutput, "<*> printer should not be called"); } <*> + ^^^ +input.y:24.70-72: warning: useless %printer for type <*> [-Wother] + %printer { fprintf (yyoutput, "<*> printer should not be called"); } <*> + ^^^ +input.y:33.3-23: warning: unset value: $$ [-Wother] { @$ = 4; } // Only used. ^^^^^^^^^^^^^^^^^^^^^ -input.y:32.3-23: warning: unused value: $3 +input.y:32.3-23: warning: unused value: $3 [-Wother] { USE ($$); @$ = 3; } // Only set. ^^^^^^^^^^^^^^^^^^^^^ ]]) @@@ -1442,9 -1412,8 +1443,9 @@@ AT_CHECK_ACTION_LOCATIONS([[%printer]] ## Qualified $$ in actions. ## ## ------------------------- ## -# Check that we can used qualified $$ (v.g., $$) not only in -# rule actions, but also where $$ is valid: %printer and %destructor. +# Check that we can use qualified $$ (v.g., $$) not only in rule +# actions, but also where $$ is valid: %destructor/%printer and +# %initial-action. # # FIXME: Not actually checking %destructor, but it's the same code as # %printer... @@@ -1457,10 -1426,12 +1458,10 @@@ m4_pushdef([AT_TEST], [AT_SETUP([[Qualified $$ in actions: $1]]) -AT_BISON_OPTION_PUSHDEFS([%locations %skeleton "$1"]) +AT_BISON_OPTION_PUSHDEFS([%skeleton "$1"]) AT_DATA_GRAMMAR([[input.y]], [[%skeleton "$1" -%defines // FIXME: Mandated by lalr1.cc in Bison 2.6. -%locations // FIXME: Mandated by lalr1.cc in Bison 2.6. %debug %code requires { @@@ -1536,7 -1507,10 +1537,7 @@@ AT_FULL_COMPILE([[input]] AT_PARSER_CHECK([./input], 0, [], [stderr]) # Don't be too picky on the traces, GLR is not exactly the same. Keep # only the lines from the printer. -# -# Don't care about locations. FIXME: remove their removal when Bison -# supports C++ without locations. -AT_CHECK([[sed -ne 's/([-0-9.]*: /(/;/ival:/p' stderr]], 0, +AT_CHECK([[sed -ne '/ival:/p' stderr]], 0, [[Reading a token: Next token is token UNTYPED (ival: 10, fval: 0.1) Shifting token UNTYPED (ival: 10, fval: 0.1) Reading a token: Next token is token INT (ival: 20, fval: 0.2) @@@ -1574,37 -1548,37 +1575,37 @@@ AT_DATA([input.y] start: test2 test1 test0 testc; test2 -: 'a' { semi; /* TEST:N:2 */ } -| 'b' { if (0) {no_semi} /* TEST:N:2 */ } -| 'c' { if (0) {semi;} /* TEST:N:2 */ } -| 'd' { semi; no_semi /* TEST:Y:2 */ } -| 'e' { semi(); no_semi() /* TEST:Y:2 */ } -| 'f' { semi[]; no_semi[] /* TEST:Y:2 */ } -| 'g' { semi++; no_semi++ /* TEST:Y:2 */ } -| 'h' { {no_semi} no_semi /* TEST:Y:2 */ } -| 'i' { {semi;} no_semi /* TEST:Y:2 */ } +: 'a' { semi; /* TEST:N:2 */ } +| 'b' { if (0) {no_semi} /* TEST:N:2 */ } +| 'c' { if (0) {semi;} /* TEST:N:2 */ } +| 'd' { semi; no_semi /* TEST:Y:2 */ } +| 'e' { semi(); no_semi() /* TEST:Y:2 */ } +| 'f' { semi[]; no_semi[] /* TEST:Y:2 */ } +| 'g' { semi++; no_semi++ /* TEST:Y:2 */ } +| 'h' { {no_semi} no_semi /* TEST:Y:2 */ } +| 'i' { {semi;} no_semi /* TEST:Y:2 */ } ; test1 - : 'a' { semi; // TEST:N:1 ; -} | 'b' { if (0) {no_semi} // TEST:N:1 ; -} | 'c' { if (0) {semi;} // TEST:N:1 ; -} | 'd' { semi; no_semi // TEST:Y:1 ; -} | 'e' { semi(); no_semi() // TEST:Y:1 ; -} | 'f' { semi[]; no_semi[] // TEST:Y:1 ; -} | 'g' { semi++; no_semi++ // TEST:Y:1 ; -} | 'h' { {no_semi} no_semi // TEST:Y:1 ; -} | 'i' { {semi;} no_semi // TEST:Y:1 ; + : 'a' { semi; // TEST:N:1 ; +} | 'b' { if (0) {no_semi} // TEST:N:1 ; +} | 'c' { if (0) {semi;} // TEST:N:1 ; +} | 'd' { semi; no_semi // TEST:Y:1 ; +} | 'e' { semi(); no_semi() // TEST:Y:1 ; +} | 'f' { semi[]; no_semi[] // TEST:Y:1 ; +} | 'g' { semi++; no_semi++ // TEST:Y:1 ; +} | 'h' { {no_semi} no_semi // TEST:Y:1 ; +} | 'i' { {semi;} no_semi // TEST:Y:1 ; } ; test0 - : 'a' { semi; // TEST:N:1 {} -} | 'b' { if (0) {no_semi} // TEST:N:1 {} -} | 'c' { if (0) {semi;} // TEST:N:1 {} -} | 'd' { semi; no_semi // TEST:Y:1 {} -} | 'e' { semi(); no_semi() // TEST:Y:1 {} -} | 'f' { semi[]; no_semi[] // TEST:Y:1 {} -} | 'g' { semi++; no_semi++ // TEST:Y:1 {} -} | 'h' { {no_semi} no_semi // TEST:Y:1 {} -} | 'i' { {semi;} no_semi // TEST:Y:1 {} + : 'a' { semi; // TEST:N:1 {} +} | 'b' { if (0) {no_semi} // TEST:N:1 {} +} | 'c' { if (0) {semi;} // TEST:N:1 {} +} | 'd' { semi; no_semi // TEST:Y:1 {} +} | 'e' { semi(); no_semi() // TEST:Y:1 {} +} | 'f' { semi[]; no_semi[] // TEST:Y:1 {} +} | 'g' { semi++; no_semi++ // TEST:Y:1 {} +} | 'h' { {no_semi} no_semi // TEST:Y:1 {} +} | 'i' { {semi;} no_semi // TEST:Y:1 {} } ; testc @@@ -1621,41 -1595,41 +1622,41 @@@ string;" AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o input.c input.y]], [0], [], -[[input.y:8.48: warning: a ';' might be needed at the end of action code +[[input.y:8.48: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:8.48: future versions of Bison will not add the ';' -input.y:9.48: warning: a ';' might be needed at the end of action code +input.y:9.48: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:9.48: future versions of Bison will not add the ';' -input.y:10.48: warning: a ';' might be needed at the end of action code +input.y:10.48: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:10.48: future versions of Bison will not add the ';' -input.y:11.48: warning: a ';' might be needed at the end of action code +input.y:11.48: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:11.48: future versions of Bison will not add the ';' -input.y:12.48: warning: a ';' might be needed at the end of action code +input.y:12.48: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:12.48: future versions of Bison will not add the ';' -input.y:13.48: warning: a ';' might be needed at the end of action code +input.y:13.48: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:13.48: future versions of Bison will not add the ';' -input.y:20.1: warning: a ';' might be needed at the end of action code +input.y:20.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:20.1: future versions of Bison will not add the ';' -input.y:21.1: warning: a ';' might be needed at the end of action code +input.y:21.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:21.1: future versions of Bison will not add the ';' -input.y:22.1: warning: a ';' might be needed at the end of action code +input.y:22.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:22.1: future versions of Bison will not add the ';' -input.y:23.1: warning: a ';' might be needed at the end of action code +input.y:23.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:23.1: future versions of Bison will not add the ';' -input.y:24.1: warning: a ';' might be needed at the end of action code +input.y:24.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:24.1: future versions of Bison will not add the ';' -input.y:25.1: warning: a ';' might be needed at the end of action code +input.y:25.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:25.1: future versions of Bison will not add the ';' -input.y:31.1: warning: a ';' might be needed at the end of action code +input.y:31.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:31.1: future versions of Bison will not add the ';' -input.y:32.1: warning: a ';' might be needed at the end of action code +input.y:32.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:32.1: future versions of Bison will not add the ';' -input.y:33.1: warning: a ';' might be needed at the end of action code +input.y:33.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:33.1: future versions of Bison will not add the ';' -input.y:34.1: warning: a ';' might be needed at the end of action code +input.y:34.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:34.1: future versions of Bison will not add the ';' -input.y:35.1: warning: a ';' might be needed at the end of action code +input.y:35.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:35.1: future versions of Bison will not add the ';' -input.y:36.1: warning: a ';' might be needed at the end of action code +input.y:36.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] input.y:36.1: future versions of Bison will not add the ';' ]]) diff --combined tests/glr-regression.at index 1ab92238,e08904b6..41fc7bc7 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@@ -88,8 -88,8 +88,8 @@@ yylex (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr1.c glr-regr1.y]], 0, [], -[glr-regr1.y: conflicts: 1 shift/reduce -]) +[[glr-regr1.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] +]]) AT_COMPILE([glr-regr1]) AT_PARSER_CHECK([[./glr-regr1 BPBPB]], 0, [[E -> 'B' @@@ -195,10 -195,11 +195,11 @@@ yylex (void int main (int argc, char **argv) { + int res; input = stdin; if (argc == 2 && !(input = fopen (argv[1], "r"))) return 3; - int res = yyparse (); + res = yyparse (); if (argc == 2 && fclose (input)) return 4; return res; @@@ -207,8 -208,8 +208,8 @@@ AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr2a.c glr-regr2a.y]], 0, [], -[glr-regr2a.y: conflicts: 2 shift/reduce -]) +[[glr-regr2a.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr] +]]) AT_COMPILE([glr-regr2a]) AT_DATA([input1.txt], @@@ -327,10 -328,11 +328,11 @@@ int yylex (void int main(int argc, char* argv[]) { + int res; input = stdin; if (argc == 2 && !(input = fopen (argv[1], "r"))) return 3; - int res = yyparse (); + res = yyparse (); if (argc == 2 && fclose (input)) return 4; return res; @@@ -339,9 -341,8 +341,9 @@@ AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr3.c glr-regr3.y]], 0, [], -[glr-regr3.y: conflicts: 1 shift/reduce, 1 reduce/reduce -]) +[[glr-regr3.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] +glr-regr3.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr3]) AT_DATA([input.txt], @@@ -435,8 -436,8 +437,8 @@@ merge (YYSTYPE s1, YYSTYPE s2 AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr4.c glr-regr4.y]], 0, [], -[glr-regr4.y: conflicts: 1 reduce/reduce -]) +[[glr-regr4.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr4]) AT_PARSER_CHECK([[./glr-regr4]], 0, @@@ -495,8 -496,8 +497,8 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr5.c glr-regr5.y]], 0, [], -[glr-regr5.y: conflicts: 1 reduce/reduce -]) +[[glr-regr5.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr5]) AT_PARSER_CHECK([[./glr-regr5]], 0, [], @@@ -547,8 -548,8 +549,8 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr6.c glr-regr6.y]], 0, [], -[glr-regr6.y: conflicts: 1 reduce/reduce -]) +[[glr-regr6.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr6]) AT_PARSER_CHECK([[./glr-regr6]], 0, @@@ -636,8 -637,8 +638,8 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr7.c glr-regr7.y]], 0, [], -[glr-regr7.y: conflicts: 2 reduce/reduce -]) +[[glr-regr7.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr7]) AT_PARSER_CHECK([[./glr-regr7]], 2, [], @@@ -730,8 -731,8 +732,8 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr8.c glr-regr8.y]], 0, [], -[glr-regr8.y: conflicts: 1 reduce/reduce -]) +[[glr-regr8.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr8]) AT_PARSER_CHECK([[./glr-regr8]], 0, @@@ -810,8 -811,8 +812,8 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr9.c glr-regr9.y]], 0, [], -[glr-regr9.y: conflicts: 1 reduce/reduce -]) +[[glr-regr9.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr9]) AT_PARSER_CHECK([[./glr-regr9]], 0, [], @@@ -866,8 -867,8 +868,8 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr10.c glr-regr10.y]], 0, [], -[glr-regr10.y: conflicts: 1 reduce/reduce -]) +[[glr-regr10.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr10]) AT_PARSER_CHECK([[./glr-regr10]], 0, [], []) @@@ -924,8 -925,8 +926,8 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr11.c glr-regr11.y]], 0, [], -[glr-regr11.y: conflicts: 1 reduce/reduce -]) +[[glr-regr11.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr11]) AT_PARSER_CHECK([[./glr-regr11]], 0, [], []) @@@ -1045,9 -1046,8 +1047,9 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr12.c glr-regr12.y]], 0, [], -[glr-regr12.y: conflicts: 1 shift/reduce, 1 reduce/reduce -]) +[[glr-regr12.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] +glr-regr12.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr12]) AT_PARSER_CHECK([[./glr-regr12]], 0, [], []) @@@ -1376,8 -1376,8 +1378,8 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr14.c glr-regr14.y]], 0, [], -[glr-regr14.y: conflicts: 3 reduce/reduce -]) +[[glr-regr14.y: warning: 3 reduce/reduce conflicts [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr14]) AT_PARSER_CHECK([[./glr-regr14]], 0, @@@ -1469,8 -1469,8 +1471,8 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr15.c glr-regr15.y]], 0, [], -[glr-regr15.y: conflicts: 2 reduce/reduce -]) +[[glr-regr15.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr15]) AT_PARSER_CHECK([[./glr-regr15]], 0, [], @@@ -1529,8 -1529,8 +1531,8 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr16.c glr-regr16.y]], 0, [], -[glr-regr16.y: conflicts: 1 reduce/reduce -]) +[[glr-regr16.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr16]) AT_PARSER_CHECK([[./glr-regr16]], 0, [], @@@ -1607,8 -1607,8 +1609,8 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr17.c glr-regr17.y]], 0, [], -[glr-regr17.y: conflicts: 3 reduce/reduce -]) +[[glr-regr17.y: warning: 3 reduce/reduce conflicts [-Wconflicts-rr] +]]) AT_COMPILE([glr-regr17]) AT_PARSER_CHECK([[./glr-regr17]], 0, [], @@@ -1662,11 -1662,11 +1664,11 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o glr-regr18.c glr-regr18.y]], 1, [], -[glr-regr18.y:26.18-24: error: result type clash on merge function 'merge': != +[[glr-regr18.y:26.18-24: error: result type clash on merge function 'merge': != glr-regr18.y:25.18-24: previous declaration glr-regr18.y:27.13-19: error: result type clash on merge function 'merge': != glr-regr18.y:26.18-24: previous declaration -]) +]]) AT_CLEANUP @@@ -1710,8 -1710,8 +1712,8 @@@ main (void AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o input.c input.y]], 0, [], -[input.y: conflicts: 1 reduce/reduce -]) +[[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] +]]) AT_COMPILE([input]) AT_PARSER_CHECK([[./input]], 1, [],