From 93b68a0e09d1f4964c47ac8cf180220b22372372 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 19 Jun 2002 12:03:22 +0000 Subject: [PATCH] * tests/actions.at (Destructors): Augment to test locations. * data/bison.simple (yydestructor): Pass it the current location if locations are enabled. Prototype only when __STDC__ or C++. Change the argument names to move into the yy name space: there is user code here. --- ChangeLog | 9 +++++++++ data/bison.simple | 23 +++++++++++++++-------- tests/actions.at | 36 +++++++++++++++++++----------------- 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0b5a0ded..72403316 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2002-06-19 Akim Demaille + + * tests/actions.at (Destructors): Augment to test locations. + * data/bison.simple (yydestructor): Pass it the current location + if locations are enabled. + Prototype only when __STDC__ or C++. + Change the argument names to move into the yy name space: there is + user code here. + 2002-06-19 Akim Demaille * data/bison.simple (b4_pure_if): New. diff --git a/data/bison.simple b/data/bison.simple index 7515cb18..cf503074 100644 --- a/data/bison.simple +++ b/data/bison.simple @@ -667,7 +667,11 @@ int yyparse (void *); int yyparse (void); # endif #endif -static void yydestructor (int symbol_type, YYSTYPE symbol_value); + +#if defined (__STDC__) || defined (__cplusplus) +static void yydestructor (int yytype, + YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation])); +#endif m4_divert_push([KILL])# ======================== M4 code. # b4_declare_parser_variables @@ -1126,7 +1130,7 @@ yyerrlab1: } } #endif - yydestructor (yystos[*yyssp], *yyvsp); + yydestructor (yystos[*yyssp], *yyvsp]b4_location_if([, *yylsp])[); YYPOPSTACK; } YYABORT; @@ -1134,7 +1138,7 @@ yyerrlab1: YYDPRINTF ((stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1])); - yydestructor (yychar1, yylval); + yydestructor (yychar1, yylval]b4_location_if([, yylloc])[); yychar = YYEMPTY; } @@ -1181,7 +1185,7 @@ yyerrlab1: } #endif - yydestructor (yystos[yystate], *yyvsp); + yydestructor (yystos[yystate], *yyvsp]b4_location_if([, *yylsp])[); yyvsp--; yystate = *--yyssp; ]b4_location_if([ yylsp--;])[ @@ -1251,24 +1255,27 @@ m4_divert_push([KILL])# M4 code. # b4_symbol_destructor(SYMBOL-NUMBER, DESTRUCTOR, TYPE-NAME) # ---------------------------------------------------------- m4_define([b4_symbol_destructor], -[m4_pushdef([b4_dollar_dollar], [symbol_value.$6])dnl +[m4_pushdef([b4_dollar_dollar], [yyvalue.$6])dnl +m4_pushdef([b4_at_dollar], [yylocation])dnl case $4: /* $3 */ #line $2 "$1" $5; #line __oline__ "__ofile__" break; +m4_popdef([b4_at_dollar])dnl m4_popdef([b4_dollar_dollar])]) m4_divert_pop([KILL])dnl# End of M4 code. static void -yydestructor (int symbol_type, YYSTYPE symbol_value) +yydestructor (int yytype, + YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation])) { - switch (symbol_type) + switch (yytype) { m4_map([b4_symbol_destructor], m4_defn([b4_symbol_destructors]))dnl default: YYDPRINTF ((stderr, "yydestructor: unknown symbol type: %d (%s)\n", - symbol_type, yytname[[symbol_type]])); + yytype, yytname[[yytype]])); break; } } diff --git a/tests/actions.at b/tests/actions.at index 8da9d3ea..990b72bd 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -177,10 +177,10 @@ AT_DATA([[input.y]], int ival; } %type 'x' thing line input -%destructor { printf ("Freeing input %d\n", $$); } input -%destructor { printf ("Freeing line %d\n", $$); } line -%destructor { printf ("Freeing thing %d\n", $$); } thing -%destructor { printf ("Freeing 'x' %d\n", $$); } 'x' +%destructor { printf ("Freeing input %d from %d\n", $$, @$.first_line); } input +%destructor { printf ("Freeing line %d from %d\n", $$, @$.first_line); } line +%destructor { printf ("Freeing thing %d from %d\n", $$, @$.first_line); } thing +%destructor { printf ("Freeing 'x' %d from %d\n", $$, @$.first_line); } 'x' %{ static int yylex (void); @@ -256,6 +256,8 @@ yylex (void) { yylval.ival = counter; printf ("sending: '%c'(%d)\n", input[counter], counter); + /* As in BASIC, line numbers go from 10 to 10. */ + yylloc.first_line = 10 * counter; return input[counter++]; } else @@ -268,7 +270,7 @@ yylex (void) static void yyerror (const char *msg) { - fprintf (stdout, "%s\n", msg); + fprintf (stdout, "%d: %s\n", yylloc.first_line, msg); } static void @@ -291,7 +293,7 @@ main (void) } ]]) -AT_CHECK([bison input.y -d -v -o input.c]) +AT_CHECK([bison input.y --location -d -v -o input.c]) AT_CHECK([$CC $CFLAGS $CPPFLAGS input.c -o input], 0, [], [ignore]) AT_CHECK([./input], 1, [[sending: 'x'(0) @@ -301,15 +303,15 @@ thing(1): 'x'(1) sending: 'x'(2) thing(2): 'x'(2) sending: 'x'(3) -parse error, unexpected 'x', expecting ';' -Freeing thing 2 -Freeing thing 1 -Freeing thing 0 -Freeing 'x' 3 +30: parse error, unexpected 'x', expecting ';' +Freeing thing 2 from 20 +Freeing thing 1 from 10 +Freeing thing 0 from 0 +Freeing 'x' 3 from 30 sending: 'x'(4) -Freeing 'x' 4 +Freeing 'x' 4 from 40 sending: 'x'(5) -Freeing 'x' 5 +Freeing 'x' 5 from 50 sending: ';'(6) line(-1): error ';' sending: 'x'(7) @@ -323,11 +325,11 @@ thing(10): 'x'(10) sending: ';'(11) line(10): thing(10) ';' sending: 'y'(12) -parse error, unexpected $undefined., expecting $ or error or 'x' +120: parse error, unexpected $undefined., expecting $ or error or 'x' sending: EOF -Freeing line 10 -Freeing line 7 -Freeing line -1 +Freeing line 10 from 100 +Freeing line 7 from 70 +Freeing line -1 from 50 Parsing FAILED. ]]) -- 2.45.2