From b8458aa5ccca039e48c37a3947df3025e3acbcee Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 20 Sep 2004 12:24:45 +0000 Subject: [PATCH] * 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. --- ChangeLog | 11 +++++++++++ data/glr.c | 25 +++++++++++++++++++++---- data/yacc.c | 32 ++++++++++++++++++++++---------- 3 files changed, 54 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 388ad7f2..fad3a07d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2004-09-20 Akim Demaille + + * 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. + 2004-09-20 Akim Demaille * data/yacc.c (YY_LOCATION_PRINT): New. diff --git a/data/glr.c b/data/glr.c index 060b3283..68af5f1a 100644 --- a/data/glr.c +++ b/data/glr.c @@ -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; diff --git a/data/yacc.c b/data/yacc.c index 840e7cec..f1040ebd 100644 --- a/data/yacc.c +++ b/data/yacc.c @@ -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) ]{ -- 2.45.2