mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 04:13:03 +00:00
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.
This commit is contained in:
18
ChangeLog
18
ChangeLog
@@ -1,3 +1,21 @@
|
||||
2008-02-20 Joel E. Denny <jdenny@ces.clemson.edu>
|
||||
|
||||
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 <jdenny@ces.clemson.edu>
|
||||
|
||||
* runtime-po/POTFILES.in (push.c): Remove.
|
||||
|
||||
28
data/yacc.c
28
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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user