mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-27 21:23: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>
|
2008-02-19 Joel E. Denny <jdenny@ces.clemson.edu>
|
||||||
|
|
||||||
* runtime-po/POTFILES.in (push.c): Remove.
|
* 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
|
/* Used to determine if this is the first time this instance has
|
||||||
been used. */
|
been used. */
|
||||||
int yynew;
|
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],
|
return yypull_parse (0]m4_ifset([b4_parse_param],
|
||||||
[[, ]b4_c_args(b4_parse_param)])[);
|
[[, ]b4_c_args(b4_parse_param)])[);
|
||||||
}]b4_pure_if([], [[
|
}
|
||||||
|
|
||||||
static char yypstate_allocated = 0;]])[
|
|
||||||
|
|
||||||
]b4_c_function_def([[yypull_parse]], [[int]],
|
]b4_c_function_def([[yypull_parse]], [[int]],
|
||||||
[[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [,
|
[[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [,
|
||||||
b4_parse_param]))[
|
b4_parse_param]))[
|
||||||
{
|
{
|
||||||
int yystatus;
|
int yystatus;
|
||||||
yypstate *yyps_local;
|
yypstate *yyps_local;]b4_pure_if([[
|
||||||
]b4_pure_if([[ int yychar;
|
int yychar;
|
||||||
YYSTYPE yylval;
|
YYSTYPE yylval;]b4_locations_if([[
|
||||||
]b4_locations_if([[ YYLTYPE yylloc;
|
YYLTYPE yylloc;]])])[
|
||||||
]])])[
|
|
||||||
if (yyps == 0)
|
if (yyps == 0)
|
||||||
{
|
{
|
||||||
yyps_local = yypstate_new ();
|
yyps_local = yypstate_new ();
|
||||||
@@ -1120,17 +1119,14 @@ static char yypstate_allocated = 0;]])[
|
|||||||
if (yyps == 0)
|
if (yyps == 0)
|
||||||
yypstate_delete (yyps_local);
|
yypstate_delete (yyps_local);
|
||||||
return yystatus;
|
return yystatus;
|
||||||
}
|
}]])[
|
||||||
]])[
|
|
||||||
/* Initialize the parser data structure. */
|
/* Initialize the parser data structure. */
|
||||||
]b4_c_function_def([[yypstate_new]], [[yypstate *]])[
|
]b4_c_function_def([[yypstate_new]], [[yypstate *]])[
|
||||||
{
|
{
|
||||||
yypstate *yyps;]b4_pure_if([], [[
|
yypstate *yyps;]b4_pure_if([], [[
|
||||||
if (yypstate_allocated)
|
if (yypstate_allocated)
|
||||||
{
|
return 0;]])[
|
||||||
yyerror (]b4_yyerror_args[YY_("cannot allocate multiple impure push-parser instances"));
|
|
||||||
return 0;
|
|
||||||
}]])[
|
|
||||||
yyps = (yypstate *) malloc (sizeof *yyps);
|
yyps = (yypstate *) malloc (sizeof *yyps);
|
||||||
if (!yyps)
|
if (!yyps)
|
||||||
return 0;
|
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)
|
@deftypefun yypstate *yypstate_new (void)
|
||||||
The fuction will return a valid parser instance if there was memory available
|
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
|
@end deftypefun
|
||||||
|
|
||||||
@node Parser Delete Function
|
@node Parser Delete Function
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ AT_CLEANUP
|
|||||||
|
|
||||||
AT_SETUP([[Push Parsing: Multiple impure instances]])
|
AT_SETUP([[Push Parsing: Multiple impure instances]])
|
||||||
|
|
||||||
|
m4_pushdef([AT_MULTIPLE_IMPURE_INSTANCES_CHECK], [
|
||||||
AT_DATA_GRAMMAR([[input.y]],
|
AT_DATA_GRAMMAR([[input.y]],
|
||||||
[[
|
[[
|
||||||
%{
|
%{
|
||||||
@@ -92,7 +93,7 @@ AT_DATA_GRAMMAR([[input.y]],
|
|||||||
int yylex (void);
|
int yylex (void);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%define api.push_pull "both"
|
%define api.push_pull "]$1["
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
@@ -123,11 +124,11 @@ main (void)
|
|||||||
ps = yypstate_new ();
|
ps = yypstate_new ();
|
||||||
assert (ps);
|
assert (ps);
|
||||||
assert (yypstate_new () == NULL);
|
assert (yypstate_new () == NULL);
|
||||||
assert (yyparse () == 2);
|
]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[;
|
||||||
yychar = 0;
|
yychar = 0;
|
||||||
assert (yypush_parse (ps) == 0);
|
assert (yypush_parse (ps) == 0);
|
||||||
assert (yypstate_new () == NULL);
|
assert (yypstate_new () == NULL);
|
||||||
assert (yyparse () == 2);
|
]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[;
|
||||||
yypstate_delete (ps);
|
yypstate_delete (ps);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,16 +138,13 @@ main (void)
|
|||||||
|
|
||||||
AT_BISON_CHECK([[-o input.c input.y]])
|
AT_BISON_CHECK([[-o input.c input.y]])
|
||||||
AT_COMPILE([[input]])
|
AT_COMPILE([[input]])
|
||||||
AT_PARSER_CHECK([[./input]], 0, [],
|
AT_PARSER_CHECK([[./input]])
|
||||||
[[cannot allocate multiple impure push-parser instances
|
])
|
||||||
cannot allocate multiple impure push-parser instances
|
|
||||||
cannot allocate multiple impure push-parser instances
|
AT_MULTIPLE_IMPURE_INSTANCES_CHECK([[both]])
|
||||||
cannot allocate multiple impure push-parser instances
|
AT_MULTIPLE_IMPURE_INSTANCES_CHECK([[push]])
|
||||||
cannot allocate multiple impure push-parser instances
|
|
||||||
cannot allocate multiple impure push-parser instances
|
m4_popdef([AT_MULTIPLE_IMPURE_INSTANCES_CHECK])
|
||||||
cannot allocate multiple impure push-parser instances
|
|
||||||
cannot allocate multiple impure push-parser instances
|
|
||||||
]])
|
|
||||||
|
|
||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user