* data/yacc.c (YY_LOCATION_PRINT): Use YYLTYPE_IS_TRIVIAL as a

clearer criterion to define it.
(parse): Initialize the initial location when YYLTYPE_IS_TRIVIAL.
When reducing on an empty RHS, use the latest stacked location as
location.
yylloc is not always available.
* data/glr.c: Likewise.
Also, honor initial-actions.
This commit is contained in:
Akim Demaille
2004-09-20 12:24:45 +00:00
parent 3fc16193d9
commit b8458aa5cc
3 changed files with 54 additions and 14 deletions

View File

@@ -427,9 +427,9 @@ static const ]b4_int_type_for([b4_stos])[ yystos[] =
#ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \
((yyCurrent).first_line = YYRHSLOC(yyRhs, 1).first_line, \
((yyCurrent).first_line = YYRHSLOC(yyRhs, 1).first_line, \
(yyCurrent).first_column = YYRHSLOC(yyRhs, 1).first_column, \
(yyCurrent).last_line = YYRHSLOC(yyRhs, YYN).last_line, \
(yyCurrent).last_line = YYRHSLOC(yyRhs, YYN).last_line, \
(yyCurrent).last_column = YYRHSLOC(yyRhs, YYN).last_column)
/* YY_LOCATION_PRINT -- Print the location on the stream.
@@ -720,7 +720,7 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
if (yyrhslen == 0)
{
*yyvalp = yyval_default;
*yylocp = yyloc_default;
*yylocp = yyvsp[0].yystate.yyloc;
}
else
{
@@ -1825,7 +1825,24 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
if (setjmp (yystack.yyexception_buffer) != 0)
goto yyDone;
yyglrShift (&yystack, 0, 0, 0, yyval_default, &yyloc_default]b4_user_args[);
yylval = yyval_default;
]b4_location_if([
#if YYLTYPE_IS_TRIVIAL
yylloc.first_line = yylloc.last_line = 1;
yylloc.first_column = yylloc.last_column = 0;
#endif
])
m4_ifdef([b4_initial_action], [
m4_pushdef([b4_at_dollar], [(yylval)])dnl
m4_pushdef([b4_dollar_dollar], [(yylloc)])dnl
/* User initialization code. */
b4_initial_action
m4_popdef([b4_dollar_dollar])dnl
m4_popdef([b4_at_dollar])dnl
/* Line __line__ of glr.c. */
b4_syncline([@oline@], [@ofile@])])dnl
[
yyglrShift (&yystack, 0, 0, 0, yylval, &yylloc]b4_user_args[);
yytoken = YYEMPTY;
yyposn = 0;

View File

@@ -514,18 +514,21 @@ while (0)
(Current).first_column = (Rhs)[1].first_column, \
(Current).last_line = (Rhs)[N].last_line, \
(Current).last_column = (Rhs)[N].last_column)
#endif
/* YY_LOCATION_PRINT -- Print the location on the stream.
This macro was not mandated originally: define only if we know
we won't break user code: when these are the locations we know. */
# define YY_LOCATION_PRINT(File, Loc) \
fprintf (File, "%d.%d-%d.%d", \
(Loc).first_line, (Loc).first_column, \
(Loc).last_line, (Loc).last_column)
#endif
#ifndef YY_LOCATION_PRINT
# if YYLTYPE_IS_TRIVIAL
# define YY_LOCATION_PRINT(File, Loc) \
fprintf (File, "%d.%d-%d.%d", \
(Loc).first_line, (Loc).first_column, \
(Loc).last_line, (Loc).last_column)
# endif
#else
# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
#endif
@@ -815,8 +818,14 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
yyssp = yyss;
yyvsp = yyvs;
]b4_location_if([ yylsp = yyls;])[
]m4_ifdef([b4_initial_action], [
]b4_location_if([[ yylsp = yyls;
#if YYLTYPE_IS_TRIVIAL
/* Initialize the default location before parsing starts. */
yyls[0].first_line = yyls[0].last_line = 1;
yyls[0].first_column = yyls[0].last_column = 0;
#endif
]])
m4_ifdef([b4_initial_action], [
m4_pushdef([b4_at_dollar], [(*yylsp)])dnl
m4_pushdef([b4_dollar_dollar], [(*yyvsp)])dnl
/* User initialization code. */
@@ -1008,8 +1017,11 @@ yyreduce:
yyval = yyvsp[1-yylen];
]b4_location_if(
[ /* Default location. */
YYLLOC_DEFAULT (yyloc, yylsp - yylen, yylen);])[
[[ /* Default location. */
if (yylen)
YYLLOC_DEFAULT (yyloc, yylsp - yylen, yylen);
else
yyloc = yylsp[0];]])[
YY_REDUCE_PRINT (yyn);
switch (yyn)
]{