X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/75d1fe16112a39706f26ac0d4d2784162e49f874..c0cac722f7e5d7498528a67a37477cdf9ed1745c:/tests/actions.at?ds=sidebyside diff --git a/tests/actions.at b/tests/actions.at index ed56174b..ff230918 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -73,8 +73,8 @@ main (void) ]]) AT_CHECK([bison input.y -d -v -o input.c]) -AT_CHECK([$CC $CFLAGS $CPPFLAGS input.c -o input], 0, [], [ignore]) -AT_CHECK([./input], 0, +AT_COMPILE([input]) +AT_PARSER_CHECK([./input], 0, [[0123456789 ]]) @@ -88,8 +88,6 @@ AT_CLEANUP AT_SETUP([Exotic Dollars]) -# Make sure complex $n work. - AT_DATA([[input.y]], [[%{ # include @@ -146,9 +144,195 @@ main (void) ]]) AT_CHECK([bison input.y -d -v -o input.c]) -AT_CHECK([$CC $CFLAGS $CPPFLAGS input.c -o input], 0, [], [ignore]) -AT_CHECK([./input], 0, +AT_COMPILE([input]) +AT_PARSER_CHECK([./input], 0, [[15 ]]) AT_CLEANUP + + + +## -------------------------- ## +## Printers and Destructors. ## +## -------------------------- ## + +AT_SETUP([Printers and Destructors]) + +# Make sure complex $n work. + +AT_DATA([[input.y]], +[[%{ +#include +#include +#include + +#define YYERROR_VERBOSE 1 +#define YYDEBUG 1 +%} +%verbose +%union +{ + int ival; +} +%type 'x' thing line input + +%printer { fprintf (yyout, "%d from %d", $$, @$.first_line); } + input line thing 'x' + +%destructor + { + fprintf (stdout, "Freeing "); + /* FIXME: Ouch: INTERNAL DETAILS EXPOSED HERE. */ + /* Cannot use $$ which is the union member, not the union itself. */ + yysymprint (stdout, yytype, yyvalue, @$); + fprintf (stdout, "\n"); + } + input line thing 'x' + +%{ +static int yylex (void); +static void yyerror (const char *msg); +%} + + +%% +input: + /* Nothing. */ + { + $$ = 0; + printf ("input(%d): /* Nothing */';'\n", $$); + } +| line input /* Right recursive to load the stack so that popping at + EOF can be exercised. */ + { + $$ = 2; + printf ("input(%d): line(%d) input(%d)';'\n", $$, $1, $2); + } +; + +line: + thing thing thing ';' + { + $$ = $1; + printf ("line(%d): thing(%d) thing(%d) thing(%d) ';'\n", $$, $1, $2, $3); + } +| thing thing ';' + { + $$ = $1; + printf ("line(%d): thing(%d) thing(%d) ';'\n", $$, $1, $2); + } +| thing ';' + { + $$ = $1; + printf ("line(%d): thing(%d) ';'\n", $$, $1); + } +| error ';' + { + $$ = -1; + printf ("line(%d): error ';'\n", $$); + } +; + +thing: + 'x' + { + $$ = $1; + printf ("thing(%d): 'x'(%d)\n", $$, $1); + } +; +%% +static int +yylex (void) +{ + static const unsigned int input[] = + { + /* Exericise the discarding of stack top and input until `error' + can be reduced. */ + 'x', 'x', 'x', 'x', 'x', 'x', ';', + + /* Load the stack and provoke an error that cannot be caught by + the grammar, to check that the stack is cleared. */ + 'x', 'x', ';', + 'x', ';', + 'y' + }; + static unsigned int counter = 0; + + if (counter < (sizeof(input) / sizeof (input[0]))) + { + yylval.ival = counter; + /* As in BASIC, line numbers go from 10 to 10. */ + yylloc.first_line = 10 * counter; + printf ("sending: '%c' (value = %d, line %d)\n", + input[counter], yylval.ival, yylloc.first_line); + return (int) input[counter++]; + } + else + { + printf ("sending: EOF\n"); + return EOF; + } +} + +static void +yyerror (const char *msg) +{ + fprintf (stdout, "%d: %s\n", yylloc.first_line, msg); +} + +int +main (void) +{ + yydebug = !!getenv ("YYDEBUG"); + if (yyparse ()) + { + fprintf (stdout, "Parsing FAILED.\n"); + exit (1); + } + fprintf (stdout, "Successful parse.\n"); + return 0; +} +]]) + +AT_CHECK([bison input.y --location -d -v -o input.c]) +AT_COMPILE([input]) +AT_PARSER_CHECK([./input], 1, +[[sending: 'x' (value = 0, line 0) +thing(0): 'x'(0) +sending: 'x' (value = 1, line 10) +thing(1): 'x'(1) +sending: 'x' (value = 2, line 20) +thing(2): 'x'(2) +sending: 'x' (value = 3, line 30) +30: parse error, unexpected 'x', expecting ';' +Freeing nterm thing (2 from 20) +Freeing nterm thing (1 from 10) +Freeing nterm thing (0 from 0) +Freeing token 'x' (3 from 30) +sending: 'x' (value = 4, line 40) +Freeing token 'x' (4 from 40) +sending: 'x' (value = 5, line 50) +Freeing token 'x' (5 from 50) +sending: ';' (value = 6, line 60) +line(-1): error ';' +sending: 'x' (value = 7, line 70) +thing(7): 'x'(7) +sending: 'x' (value = 8, line 80) +thing(8): 'x'(8) +sending: ';' (value = 9, line 90) +line(7): thing(7) thing(8) ';' +sending: 'x' (value = 10, line 100) +thing(10): 'x'(10) +sending: ';' (value = 11, line 110) +line(10): thing(10) ';' +sending: 'y' (value = 12, line 120) +120: parse error, unexpected $undefined, expecting $end or 'x' +sending: EOF +Freeing nterm line (10 from 100) +Freeing nterm line (7 from 70) +Freeing nterm line (-1 from 50) +Parsing FAILED. +]]) + +AT_CLEANUP