On Wed, 20 Feb 2008, Bob Rossi wrote: > My next error was this, I only added, > %define api.push_pull "push" > to my bison input file. That caused this compiler error, > if gcc -DHAVE_CONFIG_H -I. -I../../../../cgdb/lib/gdbmi/src -I.. > -I../../../../cgdb/lib/gdbmi/src/mi_oc_parser -g -O2 -MT gdbmi_grammar.o -MD > -MP -MF ".deps/gdbmi_grammar.Tpo" -c -o gdbmi_grammar.o > ../../../../cgdb/lib/gdbmi/src/gdbmi_grammar.c; \ > then mv -f ".deps/gdbmi_grammar.Tpo" ".deps/gdbmi_grammar.Po"; else > rm -f ".deps/gdbmi_grammar.Tpo"; exit 1; fi > ../../../../cgdb/lib/gdbmi/src/gdbmi_grammar.c: In function > ‘gdbmi_pstate_new’: > ../../../../cgdb/lib/gdbmi/src/gdbmi_grammar.c:1226: error: > ‘yypstate_allocated’ undeclared (first use in this function) > ../../../../cgdb/lib/gdbmi/src/gdbmi_grammar.c:1226: error: (Each > undeclared identifier is reported only once > ../../../../cgdb/lib/gdbmi/src/gdbmi_grammar.c:1226: error: for each > function it appears in.) > ../../../../cgdb/lib/gdbmi/src/gdbmi_grammar.c: In function > ‘gdbmi_pstate_delete’: > ../../../../cgdb/lib/gdbmi/src/gdbmi_grammar.c:1256: error: > ‘yypstate_allocated’ undeclared (first use in this function) > make[5]: *** [gdbmi_grammar.o] Error 1 > make[5]: Leaving directory > `/home/bob/rcs/svn/cgdb/trunk-gdbmi/build/lib/gdbmi/src' > of course, this happens because of this code in yacc.c, > }]b4_pure_if([], [[ > > static char yypstate_allocated = 0;]])[ > so I had to add, > %define api.pure > > Is this what you would expect or is this a regression? I'm pretty sure > you were pushing for both pure and non pure push parsers.
Thanks. It's a regression. Impure push-only parsers are an odd case since, without a pull interface, they don't seem very helpful for backward compatibility. Nevertheless, the case shouldn't be broken. I committed this, which also fixes a bug I found while exploring your other email today. Index: ChangeLog =================================================================== RCS file: /sources/bison/bison/ChangeLog,v retrieving revision 1.1772 diff -p -u -r1.1772 ChangeLog --- ChangeLog 20 Feb 2008 00:50:00 -0000 1.1772 +++ ChangeLog 20 Feb 2008 18:17:01 -0000 @@ -1,3 +1,21 @@ +2008-02-20 Joel E. Denny <[EMAIL PROTECTED]> + + Fix impure push parser compile error reported by Bob Rossi at + <http://lists.gnu.org/archive/html/help-bison/2008-02/msg00023.html>. + * data/yacc.c: Clean up whitespace in the output a little. + (yypstate_allocated): Define for impure push parsers regardless of + whether the pull interface is also requested. + * tests/push.at (Push Parsing: Multiple impure instances): Extend to + check impure push parsers without the pull interface. + + * data/yacc.c (yypstate_new): Don't try to invoke yyerror since + yyerror takes arguments specified by %parse-param while yypstate_new + does not. + * doc/bison.texinfo (Parser Create Function): Document that + yypstate_new returns 0 for multiple impure parser instances. + * tests/push.at (Push Parsing: Multiple impure instances): Update + expected stderr output. + 2008-02-19 Joel E. Denny <[EMAIL PROTECTED]> * runtime-po/POTFILES.in (push.c): Remove. Index: data/yacc.c =================================================================== RCS file: /sources/bison/bison/data/yacc.c,v retrieving revision 1.172 diff -p -u -r1.172 yacc.c --- data/yacc.c 17 Feb 2008 19:55:48 -0000 1.172 +++ data/yacc.c 20 Feb 2008 18:17:01 -0000 @@ -1079,26 +1079,25 @@ b4_push_if( /* Used to determine if this is the first time this instance has been used. */ int yynew; - }; + };]b4_pure_if([], [[ -]b4_pull_if([b4_c_function_def([[yyparse]], [[int]], b4_parse_param)[ +static char yypstate_allocated = 0;]])b4_pull_if([ + +b4_c_function_def([[yyparse]], [[int]], b4_parse_param)[ { return yypull_parse (0]m4_ifset([b4_parse_param], [[, ]b4_c_args(b4_parse_param)])[); -}]b4_pure_if([], [[ - -static char yypstate_allocated = 0;]])[ +} ]b4_c_function_def([[yypull_parse]], [[int]], [[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [, b4_parse_param]))[ { int yystatus; - yypstate *yyps_local; -]b4_pure_if([[ int yychar; - YYSTYPE yylval; -]b4_locations_if([[ YYLTYPE yylloc; -]])])[ + yypstate *yyps_local;]b4_pure_if([[ + int yychar; + YYSTYPE yylval;]b4_locations_if([[ + YYLTYPE yylloc;]])])[ if (yyps == 0) { yyps_local = yypstate_new (); @@ -1120,17 +1119,14 @@ static char yypstate_allocated = 0;]])[ if (yyps == 0) yypstate_delete (yyps_local); return yystatus; -} -]])[ +}]])[ + /* Initialize the parser data structure. */ ]b4_c_function_def([[yypstate_new]], [[yypstate *]])[ { yypstate *yyps;]b4_pure_if([], [[ if (yypstate_allocated) - { - yyerror (]b4_yyerror_args[YY_("cannot allocate multiple impure push-parser instances")); - return 0; - }]])[ + return 0;]])[ yyps = (yypstate *) malloc (sizeof *yyps); if (!yyps) return 0; Index: doc/bison.texinfo =================================================================== RCS file: /sources/bison/bison/doc/bison.texinfo,v retrieving revision 1.250 diff -p -u -r1.250 bison.texinfo --- doc/bison.texinfo 17 Feb 2008 02:47:53 -0000 1.250 +++ doc/bison.texinfo 20 Feb 2008 18:17:05 -0000 @@ -5339,7 +5339,9 @@ This function is available if either the @deftypefun yypstate *yypstate_new (void) The fuction will return a valid parser instance if there was memory available -or NULL if no memory was available. +or 0 if no memory was available. +In impure mode, it will also return 0 if a parser instance is currently +allocated. @end deftypefun @node Parser Delete Function Index: tests/push.at =================================================================== RCS file: /sources/bison/bison/tests/push.at,v retrieving revision 1.8 diff -p -u -r1.8 push.at --- tests/push.at 22 Dec 2007 18:35:03 -0000 1.8 +++ tests/push.at 20 Feb 2008 18:17:05 -0000 @@ -83,6 +83,7 @@ AT_CLEANUP AT_SETUP([[Push Parsing: Multiple impure instances]]) +m4_pushdef([AT_MULTIPLE_IMPURE_INSTANCES_CHECK], [ AT_DATA_GRAMMAR([[input.y]], [[ %{ @@ -92,7 +93,7 @@ AT_DATA_GRAMMAR([[input.y]], int yylex (void); %} -%define api.push_pull "both" +%define api.push_pull "]$1[" %% @@ -123,11 +124,11 @@ main (void) ps = yypstate_new (); assert (ps); assert (yypstate_new () == NULL); - assert (yyparse () == 2); + ]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[; yychar = 0; assert (yypush_parse (ps) == 0); assert (yypstate_new () == NULL); - assert (yyparse () == 2); + ]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[; yypstate_delete (ps); } @@ -137,16 +138,13 @@ main (void) AT_BISON_CHECK([[-o input.c input.y]]) AT_COMPILE([[input]]) -AT_PARSER_CHECK([[./input]], 0, [], -[[cannot allocate multiple impure push-parser instances -cannot allocate multiple impure push-parser instances -cannot allocate multiple impure push-parser instances -cannot allocate multiple impure push-parser instances -cannot allocate multiple impure push-parser instances -cannot allocate multiple impure push-parser instances -cannot allocate multiple impure push-parser instances -cannot allocate multiple impure push-parser instances -]]) +AT_PARSER_CHECK([[./input]]) +]) + +AT_MULTIPLE_IMPURE_INSTANCES_CHECK([[both]]) +AT_MULTIPLE_IMPURE_INSTANCES_CHECK([[push]]) + +m4_popdef([AT_MULTIPLE_IMPURE_INSTANCES_CHECK]) AT_CLEANUP
_______________________________________________ help-bison@gnu.org http://lists.gnu.org/mailman/listinfo/help-bison