From 333e670c857bff3b9354f61a572edaa0e25ac695 Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Wed, 20 Feb 2008 18:23:21 +0000 Subject: [PATCH] Fix impure push parser compile error reported by Bob Rossi at . * 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. --- ChangeLog | 18 ++++++++++++++++++ data/yacc.c | 28 ++++++++++++---------------- doc/bison.texinfo | 4 +++- tests/push.at | 24 +++++++++++------------- 4 files changed, 44 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2b63b9ec..a7fef295 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2008-02-20 Joel E. Denny + + Fix impure push parser compile error reported by Bob Rossi at + . + * 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 * runtime-po/POTFILES.in (push.c): Remove. diff --git a/data/yacc.c b/data/yacc.c index 7e94146e..b871118a 100644 --- a/data/yacc.c +++ b/data/yacc.c @@ -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; diff --git a/doc/bison.texinfo b/doc/bison.texinfo index bb6d5dcc..d513b555 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -5339,7 +5339,9 @@ This function is available if either the @code{%define api.push_pull "push"} or @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 diff --git a/tests/push.at b/tests/push.at index 53b20b7d..70c1fdce 100644 --- a/tests/push.at +++ b/tests/push.at @@ -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 -- 2.45.2