X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/9534d2be80292c1a2f52997964cb4436039781c0..595284e9d0277517bac8f3fc7bcdd529d97aa6f9:/tests/actions.at diff --git a/tests/actions.at b/tests/actions.at index 120c4012..4b0019b8 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -1255,6 +1255,127 @@ AT_CHECK_ACTION_LOCATIONS([[%destructor]]) AT_CHECK_ACTION_LOCATIONS([[%printer]]) +## ------------------------- ## +## Qualified $$ in actions. ## +## ------------------------- ## + +# Check that we can use qualified $$ (v.g., $$) not only in rule +# actions, but also where $$ is valid: %destructor/%printer and +# %initial-action. +# +# FIXME: Not actually checking %destructor, but it's the same code as +# %printer... +# +# To do that, use a semantic value that has two fields (sem_type), +# declare symbols to have only one of these types (INT, float), and +# use $$ to get the other one. Including for symbols that are +# not typed (UNTYPED). + +m4_pushdef([AT_TEST], +[AT_SETUP([[Qualified $$ in actions: $1]]) + +AT_BISON_OPTION_PUSHDEFS([%skeleton "$1"]) + +AT_DATA_GRAMMAR([[input.y]], +[[%skeleton "$1" +%debug +%code requires +{ + typedef struct sem_type + { + int ival; + float fval; + } sem_type; + +# define YYSTYPE sem_type + +]AT_SKEL_CC_IF([[ +# include + static void + report (std::ostream& yyo, int ival, float fval) + { + yyo << "ival: " << ival << ", fval: " << fval; + } +]], [[ +# include + static void + report (FILE* yyo, int ival, float fval) + { + fprintf (yyo, "ival: %d, fval: %1.1f", ival, fval); + } +]])[ +} + +%code +{ + ]AT_YYERROR_DECLARE[ + ]AT_YYLEX_DECLARE[ +} + +%token UNTYPED +%token INT +%type float +%printer { report (yyo, $$, $$); } ; +%printer { report (yyo, $$, $$ ); } ; +%printer { report (yyo, $$, $$); } <>; + +%initial-action +{ + $$ = 42; + $$ = 4.2; +} + +%% +float: UNTYPED INT +{ + $$ = $1 + $2; + $$ = $1 + $][2; +}; +%% +]AT_YYERROR_DEFINE[ +]AT_YYLEX_DEFINE(AT_SKEL_CC_IF([[{yy::parser::token::UNTYPED, + yy::parser::token::INT, + EOF}]], + [[{UNTYPED, INT, EOF}]]), + [AT_VAL.ival = toknum * 10; AT_VAL.fval = toknum / 10.0;])[ +int +main (void) +{]AT_SKEL_CC_IF([[ + yy::parser p; + p.set_debug_level(1); + return p.parse ();]], [[ + yydebug = 1; + return yyparse ();]])[ +} +]]) + +AT_FULL_COMPILE([[input]]) +AT_PARSER_CHECK([./input], 0, [], [stderr]) +# Don't be too picky on the traces, GLR is not exactly the same. Keep +# only the lines from the printer. +AT_CHECK([[sed -ne '/ival:/p' stderr]], 0, +[[Reading a token: Next token is token UNTYPED (ival: 10, fval: 0.1) +Shifting token UNTYPED (ival: 10, fval: 0.1) +Reading a token: Next token is token INT (ival: 20, fval: 0.2) +Shifting token INT (ival: 20, fval: 0.2) + $][1 = token UNTYPED (ival: 10, fval: 0.1) + $][2 = token INT (ival: 20, fval: 0.2) +-> $$ = nterm float (ival: 30, fval: 0.3) +Cleanup: popping nterm float (ival: 30, fval: 0.3) +]]) + +AT_BISON_OPTION_POPDEFS + +AT_CLEANUP +]) + +AT_TEST([yacc.c]) +AT_TEST([glr.c]) +AT_TEST([lalr1.cc]) +AT_TEST([glr.cc]) + +m4_popdef([AT_TEST]) + ## ----------------------------------------------- ## ## Fix user actions without a trailing semicolon. ## ## ----------------------------------------------- ## @@ -1317,42 +1438,42 @@ string;"} AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[-o input.c input.y]], [0], [], -[[input.y:8.48: warning: a ';' might be needed at the end of action code [-Wother] -input.y:8.48: warning: future versions of Bison will not add the ';' [-Wother] -input.y:9.48: warning: a ';' might be needed at the end of action code [-Wother] -input.y:9.48: warning: future versions of Bison will not add the ';' [-Wother] -input.y:10.48: warning: a ';' might be needed at the end of action code [-Wother] -input.y:10.48: warning: future versions of Bison will not add the ';' [-Wother] -input.y:11.48: warning: a ';' might be needed at the end of action code [-Wother] -input.y:11.48: warning: future versions of Bison will not add the ';' [-Wother] -input.y:12.48: warning: a ';' might be needed at the end of action code [-Wother] -input.y:12.48: warning: future versions of Bison will not add the ';' [-Wother] -input.y:13.48: warning: a ';' might be needed at the end of action code [-Wother] -input.y:13.48: warning: future versions of Bison will not add the ';' [-Wother] -input.y:20.1: warning: a ';' might be needed at the end of action code [-Wother] -input.y:20.1: warning: future versions of Bison will not add the ';' [-Wother] -input.y:21.1: warning: a ';' might be needed at the end of action code [-Wother] -input.y:21.1: warning: future versions of Bison will not add the ';' [-Wother] -input.y:22.1: warning: a ';' might be needed at the end of action code [-Wother] -input.y:22.1: warning: future versions of Bison will not add the ';' [-Wother] -input.y:23.1: warning: a ';' might be needed at the end of action code [-Wother] -input.y:23.1: warning: future versions of Bison will not add the ';' [-Wother] -input.y:24.1: warning: a ';' might be needed at the end of action code [-Wother] -input.y:24.1: warning: future versions of Bison will not add the ';' [-Wother] -input.y:25.1: warning: a ';' might be needed at the end of action code [-Wother] -input.y:25.1: warning: future versions of Bison will not add the ';' [-Wother] -input.y:31.1: warning: a ';' might be needed at the end of action code [-Wother] -input.y:31.1: warning: future versions of Bison will not add the ';' [-Wother] -input.y:32.1: warning: a ';' might be needed at the end of action code [-Wother] -input.y:32.1: warning: future versions of Bison will not add the ';' [-Wother] -input.y:33.1: warning: a ';' might be needed at the end of action code [-Wother] -input.y:33.1: warning: future versions of Bison will not add the ';' [-Wother] -input.y:34.1: warning: a ';' might be needed at the end of action code [-Wother] -input.y:34.1: warning: future versions of Bison will not add the ';' [-Wother] -input.y:35.1: warning: a ';' might be needed at the end of action code [-Wother] -input.y:35.1: warning: future versions of Bison will not add the ';' [-Wother] -input.y:36.1: warning: a ';' might be needed at the end of action code [-Wother] -input.y:36.1: warning: future versions of Bison will not add the ';' [-Wother] +[[input.y:8.48: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:8.48: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:9.48: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:9.48: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:10.48: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:10.48: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:11.48: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:11.48: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:12.48: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:12.48: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:13.48: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:13.48: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:20.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:20.1: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:21.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:21.1: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:22.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:22.1: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:23.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:23.1: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:24.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:24.1: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:25.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:25.1: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:31.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:31.1: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:32.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:32.1: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:33.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:33.1: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:34.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:34.1: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:35.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:35.1: warning: future versions of Bison will not add the ';' [-Wdeprecated] +input.y:36.1: warning: a ';' might be needed at the end of action code [-Wdeprecated] +input.y:36.1: warning: future versions of Bison will not add the ';' [-Wdeprecated] ]]) AT_MATCHES_CHECK([input.c], [[/\* TEST:N:2 \*/ \}$]], [[3]])