From: Akim Demaille Date: Thu, 16 Sep 2004 14:14:27 +0000 (+0000) Subject: Have more complete shift traces. X-Git-Tag: BISON-2_0~113 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/1576d44dcea36851fda9da32b2d45cbe6afc712e Have more complete shift traces. * data/yacc.c, data/lalr1.c, data/glr.c: Use YY_SYMBOL_PRINT to report Shifts instead of ad hoc YYDPRINTF invocations, including for the error token. * data/lalr1.cc (symprint_): Output the location. * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): In C++, don't output the location within the %printer. Activate GLR tests, at least to make sure they compile properly. They still don't pass though. * tests/calc.at: Adjust expect verbose output, since now "Entering state..." is on a different line than the "Shifting" message. --- diff --git a/ChangeLog b/ChangeLog index 4c54cbd0..75df12e6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2004-09-16 Akim Demaille + + Have more complete shift traces. + + * data/yacc.c, data/lalr1.c, data/glr.c: Use YY_SYMBOL_PRINT + to report Shifts instead of ad hoc YYDPRINTF invocations, + including for the error token. + * data/lalr1.cc (symprint_): Output the location. + * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): In C++, don't + output the location within the %printer. + Activate GLR tests, at least to make sure they compile properly. + They still don't pass though. + * tests/calc.at: Adjust expect verbose output, since now "Entering + state..." is on a different line than the "Shifting" message. + 2004-09-08 Akim Demaille * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Move the diff --git a/data/glr.c b/data/glr.c index 49916b06..b594a83b 100644 --- a/data/glr.c +++ b/data/glr.c @@ -1578,11 +1578,11 @@ yyprocessOneStack (yyGLRStack* yystack, int yyk, if (yyisShiftAction (yyaction)) { - YYDPRINTF ((stderr, "Shifting token %s on stack %d, ", - yytokenName (*yytokenp), yyk)); + YYDPRINTF ((stderr, "On stack %d, ", yyk)); + YY_SYMBOL_PRINT ("shifting", yytokenp, yylvalp, yyllocp); yyglrShift (yystack, yyk, yyaction, yyposn+1, *yylvalp, yyllocp]b4_user_args[); - YYDPRINTF ((stderr, "which is now in state #%d\n", + YYDPRINTF ((stderr, ", now in state #%d\n", yystack->yytops.yystates[yyk]->yylrState)); break; } @@ -1750,7 +1750,8 @@ yyrecoverSyntaxError (yyGLRStack* yystack, if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR && yyisShiftAction (yytable[yyj])) { - YYDPRINTF ((stderr, "Shifting error token, ")); + YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]], + yylvalp, yyllocp); yyglrShift (yystack, 0, yytable[yyj], yys->yyposn, *yylvalp, yyllocp]b4_user_args[); break; @@ -1856,8 +1857,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack, break; if (yyisShiftAction (yyaction)) { - YYDPRINTF ((stderr, "Shifting token %s, ", - yytokenName (yytoken))); + YY_SYMBOL_PRINT ("Shifting", yytoken, yylvalp, yyllocp); if (yytoken != YYEOF) yytoken = YYEMPTY; yyposn += 1; diff --git a/data/lalr1.cc b/data/lalr1.cc index cd3cbb84..f246d0b8 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -400,7 +400,8 @@ yy::]b4_parser_class_name[::symprint_ (int yytype, (void) yylocationp; cdebug_ << (yytype < ntokens_ ? "token" : "nterm") - << ' ' << name_[yytype] << " ("; + << ' ' << name_[yytype] << " (" + << *yylocationp << ": "; switch (yytype) { ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl @@ -419,8 +420,6 @@ yy::]b4_parser_class_name[::destruct_ (const char *yymsg, (void) yyvaluep; (void) yylocationp; - if (!yymsg) - yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) @@ -520,10 +519,7 @@ yybackup: goto yyacceptlab; /* Shift the look-ahead token. */ -#if YYDEBUG - YYCDEBUG << "Shifting token " << looka_ - << " (" << name_[ilooka_] << "), "; -#endif + YY_SYMBOL_PRINT ("Shifting", ilooka_, &value, &location); /* Discard the token being shifted unless it is eof. */ if (looka_ != eof_) @@ -697,8 +693,6 @@ yyerrlab1: if (n_ == final_) goto yyacceptlab; - YYCDEBUG << "Shifting error token, "; - { Location errloc; errloc.begin = error_start_; @@ -707,6 +701,10 @@ yyerrlab1: location_stack_.push (errloc); } + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", stos_[n_], + &semantic_stack_[0], &location_stack_[0]); + state_ = n_; goto yynewstate; diff --git a/data/yacc.c b/data/yacc.c index 42c72616..cf6c4329 100644 --- a/data/yacc.c +++ b/data/yacc.c @@ -946,7 +946,7 @@ yybackup: YYACCEPT; /* Shift the look-ahead token. */ - YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) @@ -1185,12 +1185,13 @@ yyerrlab1: if (yyn == YYFINAL) YYACCEPT; - YYDPRINTF ((stderr, "Shifting error token, ")); - *++yyvsp = yylval; ]b4_location_if([ YYLLOC_DEFAULT (yyloc, yylsp, yylerrsp - yylsp); *++yylsp = yyloc;])[ + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + yystate = yyn; goto yynewstate; diff --git a/tests/actions.at b/tests/actions.at index 933478c6..6de55cf9 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -196,7 +196,7 @@ m4_ifval([$6], [%union %printer { - ]AT_LALR1_CC_IF([cdebug_ << @$ << ": " << $$;], + ]AT_LALR1_CC_IF([cdebug_ << $$;], [fprintf (yyoutput, "%d@%d-%d", $$, RANGE (@$))])[; } input line thing 'x' 'y' @@ -471,7 +471,5 @@ AT_CHECK_PRINTER_AND_DESTRUCTOR([]) AT_CHECK_PRINTER_AND_DESTRUCTOR([], [with union]) AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"]) AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [with union]) - -# FIXME. These test cases fail. -#AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser]) -#AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [with union]) +AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser]) +AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [with union]) diff --git a/tests/calc.at b/tests/calc.at index 71d35f07..b7808ace 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -1,5 +1,5 @@ # Simple calculator. -*- Autotest -*- -# Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. +# Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -463,21 +463,21 @@ _AT_CHECK_CALC([$1], 2^2^3 = 256 (2^2)^3 = 64], - [486]) + [570]) # Some syntax errors. -_AT_CHECK_CALC_ERROR([$1], [1], [0 0], [12], +_AT_CHECK_CALC_ERROR([$1], [1], [0 0], [13], [1.2: syntax error, unexpected "number"]) -_AT_CHECK_CALC_ERROR([$1], [1], [1//2], [16], +_AT_CHECK_CALC_ERROR([$1], [1], [1//2], [18], [1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!']) _AT_CHECK_CALC_ERROR([$1], [1], [error], [5], [1.0: syntax error, unexpected $undefined]) -_AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3], [23], +_AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3], [26], [1.6: syntax error, unexpected '=']) _AT_CHECK_CALC_ERROR([$1], [1], [ +1], - [15], + [16], [2.0: syntax error, unexpected '+']) # Exercise error messages with EOF: work on an empty file. _AT_CHECK_CALC_ERROR([$1], [1], [/dev/null], [5], @@ -501,7 +501,7 @@ _AT_CHECK_CALC_ERROR([$1], [1], [/dev/null], [5], # _AT_CHECK_CALC_ERROR([$1], [0], [() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1], - [156], + [188], [1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' 1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' 1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' @@ -510,10 +510,10 @@ calc: error: 4444 != 1]) # The same, but this time exercising explicitly triggered syntax errors. # POSIX says the look-ahead causing the error should not be discarded. -_AT_CHECK_CALC_ERROR([$1], [0], [(!) + (0 0) = 1], [62], +_AT_CHECK_CALC_ERROR([$1], [0], [(!) + (0 0) = 1], [75], [1.9: syntax error, unexpected "number" calc: error: 2222 != 1]) -_AT_CHECK_CALC_ERROR([$1], [0], [(- *) + (0 0) = 1], [70], +_AT_CHECK_CALC_ERROR([$1], [0], [(- *) + (0 0) = 1], [85], [1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' 1.11: syntax error, unexpected "number" calc: error: 2222 != 1])