From: Akim Demaille Date: Tue, 5 Oct 2004 08:39:17 +0000 (+0000) Subject: In Bison 1.875's yacc.c, YYLLOC_DEFAULT was called regardless X-Git-Tag: BISON-2_0~96 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/b4a2033855c7d7838f8e079c0656d4e91bbb6361?ds=inline In Bison 1.875's yacc.c, YYLLOC_DEFAULT was called regardless whether the reducion was empty or not. This leaves room to improve the use of YYLLOC_DEFAULT in such a case. lalr1.cc is still experimental, so changing this is acceptable. And finally, there are probably not many users who changed the handling of locations in GLR, so changing is admissible too. * data/glr.c, data/lalr1.cc, data/yacc.c (YYLLOC_DEFAULT): On an empty reduction, set @$ to an empty location ending the previously stacked symbol. Adjust uses to make sure the code is triggered on empty reductions. * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Adjust the expected output: empty reductions have empty locations. --- diff --git a/ChangeLog b/ChangeLog index b2e72695..845b21cc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2004-10-05 Akim Demaille + + In Bison 1.875's yacc.c, YYLLOC_DEFAULT was called regardless + whether the reducion was empty or not. This leaves room to + improve the use of YYLLOC_DEFAULT in such a case. + lalr1.cc is still experimental, so changing this is acceptable. + And finally, there are probably not many users who changed the + handling of locations in GLR, so changing is admissible too. + + * data/glr.c, data/lalr1.cc, data/yacc.c (YYLLOC_DEFAULT): On an + empty reduction, set @$ to an empty location ending the previously + stacked symbol. + Adjust uses to make sure the code is triggered on empty + reductions. + * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Adjust the + expected output: empty reductions have empty locations. + 2004-09-29 Akim Demaille * data/lalr1.cc: Move towards a more standard C++ coding style diff --git a/data/glr.c b/data/glr.c index 0e569841..7f4c9216 100644 --- a/data/glr.c +++ b/data/glr.c @@ -420,17 +420,31 @@ static const ]b4_int_type_for([b4_stos])[ yystos[] = /* Error token number */ #define YYTERROR 1 -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. */ +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ ]b4_location_if([[ #define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc) #ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \ - ((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_column = YYRHSLOC(yyRhs, YYN).last_column) +# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \ +do { \ + if (YYN) \ + { \ + (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_column = YYRHSLOC(yyRhs, YYN).last_column; \ + } \ + else \ + { \ + (yyCurrent).first_line = YYRHSLOC(yyRhs, 0).last_line; \ + (yyCurrent).first_column = YYRHSLOC(yyRhs, 0).last_column; \ + (yyCurrent).last_line = YYRHSLOC(yyRhs, 0).last_line; \ + (yyCurrent).last_column = YYRHSLOC(yyRhs, 0).last_column; \ + } \ +} while(0) /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know @@ -718,15 +732,10 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, yylow = 1; if (yyrhslen == 0) - { - *yyvalp = yyval_default; - *yylocp = yyvsp[0].yystate.yyloc; - } + *yyvalp = yyval_default; else - { - *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval; - YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen); - } + *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval; + YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen); ] switch (yyn) diff --git a/data/lalr1.cc b/data/lalr1.cc index 84051710..e77e7842 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -181,13 +181,22 @@ b4_syncline([@oline@], [@ofile@])], ]/* Line __line__ of lalr1.cc. */ b4_syncline([@oline@], [@ofile@])[ -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. */ +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ #ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ -do { \ - ((Current).begin = (Rhs)[1].begin); \ - ((Current).end = (Rhs)[N].end); \ +# define YYLLOC_DEFAULT(Current, Rhs, N) \ +do { \ + if (N) \ + { \ + (Current).begin = (Rhs)[1].begin; \ + (Current).end = (Rhs)[N].end; \ + } \ + else \ + { \ + (Current).begin = (Current).end = (Rhs)[0].end; \ + } \ } while (0) #endif @@ -583,21 +592,14 @@ yyreduce: This behavior is undocumented and Bison users should not rely upon it. */ if (len_) - { - yyval = semantic_stack_[len_ - 1]; - yyloc = location_stack_[len_ - 1]; - } + yyval = semantic_stack_[len_ - 1]; else - { - yyval = semantic_stack_[0]; - yyloc = location_stack_[0]; - } + yyval = semantic_stack_[0]; - if (len_) - { - Slice slice (location_stack_, len_); - YYLLOC_DEFAULT (yyloc, slice, len_); - } + { + Slice slice (location_stack_, len_); + YYLLOC_DEFAULT (yyloc, slice, len_); + } YY_REDUCE_PRINT (n_); switch (n_) { diff --git a/data/yacc.c b/data/yacc.c index 575d2624..2e9c9fd0 100644 --- a/data/yacc.c +++ b/data/yacc.c @@ -506,14 +506,26 @@ while (0) #define YYERRCODE 256 -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. */ +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ #ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - ((Current).first_line = (Rhs)[1].first_line, \ - (Current).first_column = (Rhs)[1].first_column, \ - (Current).last_line = (Rhs)[N].last_line, \ - (Current).last_column = (Rhs)[N].last_column) +# define YYLLOC_DEFAULT(Current, Rhs, N) \ +do { \ + if (N) \ + { \ + (Current).first_line = (Rhs)[1].first_line; \ + (Current).first_column = (Rhs)[1].first_column; \ + (Current).last_line = (Rhs)[N].last_line; \ + (Current).last_column = (Rhs)[N].last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = (Rhs)[0].last_line; \ + (Current).first_column = (Current).last_column = (Rhs)[0].last_column; \ + } \ +} while(0) #endif @@ -1021,10 +1033,7 @@ yyreduce: ]b4_location_if( [[ /* Default location. */ - if (yylen) - YYLLOC_DEFAULT (yyloc, yylsp - yylen, yylen); - else - yyloc = yylsp[0];]])[ + YYLLOC_DEFAULT (yyloc, yylsp - yylen, yylen);]])[ YY_REDUCE_PRINT (yyn); switch (yyn) ]{ diff --git a/tests/actions.at b/tests/actions.at index 2ffaffb2..05d0e52b 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -372,8 +372,8 @@ thing (1@10-19): 'x' (1@10-19) sending: ')' (2@20-29) line (0@0-29): '(' (0@0-9) thing (1@10-19) ')' (2@20-29) sending: EOF (3@30-39) -input (0@0-29): /* Nothing */ -input (2@0-29): line (0@0-29) input (0@0-29) +input (0@29-29): /* Nothing */ +input (2@0-29): line (0@0-29) input (0@29-29) Successful parse. ]]) @@ -390,8 +390,8 @@ Freeing token 'y' (1@10-19) sending: ')' (2@20-29) line (-1@0-29): '(' (0@0-9) error (@10-19) ')' (2@20-29) sending: EOF (3@30-39) -input (0@0-29): /* Nothing */ -input (2@0-29): line (-1@0-29) input (0@0-29) +input (0@29-29): /* Nothing */ +input (2@0-29): line (-1@0-29) input (0@29-29) Successful parse. ]]) @@ -438,8 +438,8 @@ thing (11@110-119): 'x' (11@110-119) sending: ')' (12@120-129) line (10@100-129): '(' (10@100-109) thing (11@110-119) ')' (12@120-129) sending: 'y' (13@130-139) -input (0@100-129): /* Nothing */ -input (2@100-129): line (10@100-129) input (0@100-129) +input (0@129-129): /* Nothing */ +input (2@100-129): line (10@100-129) input (0@129-129) input (2@70-129): line (7@70-99) input (2@100-129) input (2@0-129): line (-1@0-69) input (2@70-129) 130-139: syntax error, unexpected 'y', expecting $end