mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-24 03:33:03 +00:00
Let yyerror always receive the msg as last argument, so that
yyerror can be variadic. * data/yacc.c (b4_yyerror_args): New. Use it when calling yyerror. * data/glr.c (b4_yyerror_args, b4_lyyerror_args): New. Use it when calling yyerror. * doc/bison.texinfo (Error Reporting): Adjust. * tests/calc.at (_AT_DATA_CALC_Y): Adjust. * tests/cxx-type.at (_AT_TEST_GLR_CALC): Adjust.
This commit is contained in:
13
ChangeLog
13
ChangeLog
@@ -1,3 +1,16 @@
|
||||
2002-11-07 Akim Demaille <akim@epita.fr>
|
||||
|
||||
Let yyerror always receive the msg as last argument, so that
|
||||
yyerror can be variadic.
|
||||
|
||||
* data/yacc.c (b4_yyerror_args): New.
|
||||
Use it when calling yyerror.
|
||||
* data/glr.c (b4_yyerror_args, b4_lyyerror_args): New.
|
||||
Use it when calling yyerror.
|
||||
* doc/bison.texinfo (Error Reporting): Adjust.
|
||||
* tests/calc.at (_AT_DATA_CALC_Y): Adjust.
|
||||
* tests/cxx-type.at (_AT_TEST_GLR_CALC): Adjust.
|
||||
|
||||
2002-11-07 Paul Eggert <eggert@twinsun.com>
|
||||
|
||||
* src/scan-gram.l (unexpected_end_of_file): New function.
|
||||
|
||||
26
data/glr.c
26
data/glr.c
@@ -54,9 +54,25 @@ m4_define([b4_user_formals],
|
||||
[m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])])
|
||||
|
||||
|
||||
# b4_yyerror_args
|
||||
# ---------------
|
||||
# Arguments passed to yyerror: user args plus yylloc.
|
||||
m4_define([b4_yyerror_args],
|
||||
[b4_pure_if([b4_location_if([yylocp, ])])dnl
|
||||
m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
|
||||
|
||||
|
||||
# b4_lyyerror_args
|
||||
# ----------------
|
||||
# Same as above, but on the lookahead, hence yyllocp instead of yylocp.
|
||||
m4_define([b4_lyyerror_args],
|
||||
[b4_pure_if([b4_location_if([yyllocp, ])])dnl
|
||||
m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
|
||||
|
||||
|
||||
# b4_pure_args
|
||||
# ------------
|
||||
# Arguments passed to yyerror: user args plus yylloc.
|
||||
# Arguments needed by yyerror: user args plus yylloc.
|
||||
m4_define([b4_pure_args],
|
||||
[b4_pure_if([b4_location_if([, yylocp])])[]b4_user_args])
|
||||
|
||||
@@ -581,7 +597,7 @@ yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yyformat, ...)
|
||||
va_start (yyap, yyformat);
|
||||
yystack->yyerrflag = 1;
|
||||
vsprintf (yymsg, yyformat, yyap);
|
||||
yyerror (yymsg]b4_pure_args[);
|
||||
yyerror (]b4_yyerror_args[yymsg);
|
||||
}
|
||||
longjmp (yystack->yyexception_buffer, 1);
|
||||
}
|
||||
@@ -636,7 +652,7 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
|
||||
# undef YYBACKUP
|
||||
# define YYBACKUP(Token, Value) \
|
||||
do { \
|
||||
yyerror ("syntax error: cannot back up"]b4_pure_args[); \
|
||||
yyerror (]b4_yyerror_args["syntax error: cannot back up"); \
|
||||
YYERROR; \
|
||||
} while (0)
|
||||
|
||||
@@ -1591,12 +1607,12 @@ yyreportParseError (yyGLRStack* yystack,
|
||||
yyprefix = " or ";
|
||||
}
|
||||
}
|
||||
yyerror (yymsg]b4_lpure_args[);
|
||||
yyerror (]b4_lyyerror_args[yymsg);
|
||||
free (yymsg);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
yyerror ("parse error"]b4_lpure_args[);
|
||||
yyerror (]b4_lyyerror_args["parse error");
|
||||
yynerrs += 1;
|
||||
}
|
||||
}
|
||||
|
||||
19
data/yacc.c
19
data/yacc.c
@@ -48,11 +48,12 @@ m4_define([b4_Pure_if],
|
||||
[$2])])
|
||||
|
||||
|
||||
# b4_pure_args
|
||||
# ------------
|
||||
# b4_yyerror_args
|
||||
# ---------------
|
||||
# Arguments passed to yyerror: user args plus yylloc.
|
||||
m4_define([b4_pure_args],
|
||||
[b4_Pure_if([b4_location_if([, &yylloc])])[]b4_user_args])
|
||||
m4_define([b4_yyerror_args],
|
||||
[b4_Pure_if([b4_location_if([&yylloc, ])])dnl
|
||||
m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
|
||||
|
||||
|
||||
# b4_lex_param
|
||||
@@ -529,7 +530,7 @@ do \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
yyerror ("syntax error: cannot back up"b4_pure_args); \
|
||||
yyerror (b4_yyerror_args"syntax error: cannot back up"); \
|
||||
YYERROR; \
|
||||
} \
|
||||
while (0)
|
||||
@@ -1135,15 +1136,15 @@ yyerrlab:
|
||||
yycount++;
|
||||
}
|
||||
}
|
||||
yyerror (yymsg]b4_pure_args[);
|
||||
yyerror (]b4_yyerror_args[yymsg);
|
||||
YYSTACK_FREE (yymsg);
|
||||
}
|
||||
else
|
||||
yyerror ("parse error; also virtual memory exhausted"]b4_pure_args[);
|
||||
yyerror (]b4_yyerror_args["parse error; also virtual memory exhausted");
|
||||
}
|
||||
else
|
||||
#endif /* YYERROR_VERBOSE */
|
||||
yyerror ("parse error"]b4_pure_args[);
|
||||
yyerror (]b4_yyerror_args["parse error");
|
||||
}
|
||||
goto yyerrlab1;
|
||||
|
||||
@@ -1258,7 +1259,7 @@ yyabortlab:
|
||||
| yyoverflowlab -- parser overflow comes here. |
|
||||
`----------------------------------------------*/
|
||||
yyoverflowlab:
|
||||
yyerror ("parser stack overflow"]b4_pure_args[);
|
||||
yyerror (]b4_yyerror_args["parser stack overflow");
|
||||
yyresult = 2;
|
||||
/* Fall through. */
|
||||
#endif
|
||||
|
||||
@@ -1357,7 +1357,7 @@ here is the definition we will use:
|
||||
#include <stdio.h>
|
||||
|
||||
void
|
||||
yyerror (const char *s) /* called by yyparse on error */
|
||||
yyerror (const char *s) /* Called by yyparse on error. */
|
||||
@{
|
||||
printf ("%s\n", s);
|
||||
@}
|
||||
@@ -1973,7 +1973,7 @@ main (void)
|
||||
|
||||
@group
|
||||
void
|
||||
yyerror (const char *s) /* Called by yyparse on error */
|
||||
yyerror (const char *s) /* Called by yyparse on error. */
|
||||
@{
|
||||
printf ("%s\n", s);
|
||||
@}
|
||||
@@ -4050,7 +4050,7 @@ The following definition suffices in simple programs:
|
||||
@example
|
||||
@group
|
||||
void
|
||||
yyerror (char *s)
|
||||
yyerror (const char *s)
|
||||
@{
|
||||
@end group
|
||||
@group
|
||||
@@ -4064,7 +4064,7 @@ error recovery if you have written suitable error recovery grammar rules
|
||||
(@pxref{Error Recovery}). If recovery is impossible, @code{yyparse} will
|
||||
immediately return 1.
|
||||
|
||||
Oviously, in location tracking pure parsers, @code{yyerror} should have
|
||||
Obviously, in location tracking pure parsers, @code{yyerror} should have
|
||||
an access to the current location. This is indeed the case for the GLR
|
||||
parsers, but not for the Yacc parser, for historical reasons. I.e., if
|
||||
@samp{%locations %pure-parser} is passed then the prototypes for
|
||||
@@ -4072,14 +4072,14 @@ parsers, but not for the Yacc parser, for historical reasons. I.e., if
|
||||
|
||||
@example
|
||||
void yyerror (const char *msg); /* Yacc parsers. */
|
||||
void yyerror (const char *msg, YYLTYPE *locp); /* GLR parsers. */
|
||||
void yyerror (YYLTYPE *locp, const char *msg); /* GLR parsers. */
|
||||
@end example
|
||||
|
||||
If @samp{%parse-param "int *nastiness" "nastiness"} is used, then:
|
||||
|
||||
@example
|
||||
void yyerror (int *randomness); /* Yacc parsers. */
|
||||
void yyerror (int *randomness); /* GLR parsers. */
|
||||
void yyerror (int *randomness, const char *msg); /* Yacc parsers. */
|
||||
void yyerror (int *randomness, const char *msg); /* GLR parsers. */
|
||||
@end example
|
||||
|
||||
Finally, GLR and Yacc parsers share the same @code{yyerror} calling
|
||||
@@ -4104,10 +4104,18 @@ results in the following signatures for all the parser kinds:
|
||||
@example
|
||||
int yylex (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness);
|
||||
int yyparse (int *nastiness, int *randomness);
|
||||
void yyerror (const char *msg, YYLTYPE *locp,
|
||||
int *nastiness, int *randomness);
|
||||
void yyerror (YYLTYPE *locp,
|
||||
int *nastiness, int *randomness,
|
||||
const char *msg);
|
||||
@end example
|
||||
|
||||
@noident
|
||||
Please, note that the prototypes are only indications of how the code
|
||||
produced by Bison will use @code{yyerror}, but you still have freedom
|
||||
and the exit value, and even on making @code{yyerror} a variadic
|
||||
function. It is precisely to enable this that the message is passed
|
||||
last.
|
||||
|
||||
@vindex yynerrs
|
||||
The variable @code{yynerrs} contains the number of syntax errors
|
||||
encountered so far. Normally this variable is global; but if you
|
||||
|
||||
@@ -100,9 +100,9 @@ static int power (int base, int exponent);
|
||||
/* yyerror receives the location if:
|
||||
- %location & %pure & %glr
|
||||
- %location & %pure & %yacc & %parse-param. */
|
||||
static void yyerror (const char *s
|
||||
]AT_YYERROR_ARG_LOC_IF([, YYLTYPE *yylloc])[
|
||||
]AT_PARAM_IF([, value_t *result, int *count])[
|
||||
static void yyerror (]AT_YYERROR_ARG_LOC_IF([YYLTYPE *yylloc, ])[
|
||||
]AT_PARAM_IF([value_t *result, int *count, ])[
|
||||
const char *s
|
||||
);
|
||||
static int yylex (LEX_FORMALS);
|
||||
static int yygetc (LEX_FORMALS);
|
||||
@@ -154,9 +154,10 @@ exp:
|
||||
FILE *yyin;
|
||||
|
||||
static void
|
||||
yyerror (const char *s
|
||||
]AT_YYERROR_ARG_LOC_IF([, YYLTYPE *yylloc])[
|
||||
]AT_PARAM_IF([, value_t *result, int *count])[)
|
||||
yyerror (]AT_YYERROR_ARG_LOC_IF([YYLTYPE *yylloc, ])[
|
||||
]AT_PARAM_IF([value_t *result, int *count, ])[
|
||||
const char *s
|
||||
)
|
||||
{
|
||||
]AT_PARAM_IF([(void) result; (void) count; ])[
|
||||
]AT_YYERROR_SEES_LOC_IF([
|
||||
|
||||
@@ -36,10 +36,11 @@ $1
|
||||
]m4_bmatch([$2], [stmtMerge],
|
||||
[ static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);])[
|
||||
#define YYINITDEPTH 10
|
||||
int yyerror (const char *s
|
||||
int yyerror (
|
||||
#if YYPURE && YYLSP_NEEDED
|
||||
, YYLTYPE *yylocation
|
||||
YYLTYPE *yylocation,
|
||||
#endif
|
||||
const char *s
|
||||
);
|
||||
|
||||
#if YYPURE
|
||||
@@ -157,10 +158,11 @@ yylex ()
|
||||
}
|
||||
|
||||
int
|
||||
yyerror (const char *s
|
||||
yyerror (
|
||||
#if YYPURE && YYLSP_NEEDED
|
||||
, YYLTYPE *yylocation
|
||||
YYLTYPE *yylocation,
|
||||
#endif
|
||||
const char *s
|
||||
)
|
||||
{
|
||||
#if YYPURE && YYLSP_NEEDED
|
||||
|
||||
Reference in New Issue
Block a user