From 51dec47b377d301d4656ee6da5eaafc22604e5a7 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 9 Apr 2002 19:20:10 +0000 Subject: [PATCH] * tests/calc.at (_AT_CHECK_CALC_ERROR): Receive as argument the full stderr, and strip it according to the bison options, instead of composing the error message from different bits. This makes it easier to check for several error messages. Adjust all the invocations. Add an invocation exercising the error token. Add an invocation demonstrating a stupid error message. (_AT_DATA_CALC_Y): Follow the GCS: initial column is 1, not 0. Adjust the tests. Error message are for stderr, not stdout. --- ChangeLog | 13 +++++++++ TODO | 27 +++++++++++++++--- tests/calc.at | 77 ++++++++++++++++++++++++++++++++------------------- 3 files changed, 84 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index 06220777..f4d5d46c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2002-04-09 Akim Demaille + + * tests/calc.at (_AT_CHECK_CALC_ERROR): Receive as argument the + full stderr, and strip it according to the bison options, instead + of composing the error message from different bits. + This makes it easier to check for several error messages. + Adjust all the invocations. + Add an invocation exercising the error token. + Add an invocation demonstrating a stupid error message. + (_AT_DATA_CALC_Y): Follow the GCS: initial column is 1, not 0. + Adjust the tests. + Error message are for stderr, not stdout. + 2002-04-09 Akim Demaille * src/gram.h, src/gram.c (error_token_number): Remove, use diff --git a/TODO b/TODO index 02f6b15b..ae6c3972 100644 --- a/TODO +++ b/TODO @@ -14,10 +14,29 @@ into when there are no actions. This can significantly speed up some grammars. -* Huge Grammars -Currently, not only is Bison unable to handle huge grammars because of -internal limitations (see test `big triangle'). Push the limit beyond -253. Be my guest: fix this! +* Stupid error messages +An example shows it easily: + +src/bison/tests % ./testsuite -k calc,location,error-verbose -l +GNU Bison 1.49a test suite test groups: + + NUM: FILENAME:LINE TEST-GROUP-NAME + KEYWORDS + + 51: calc.at:440 Calculator --locations --yyerror-verbose + 52: calc.at:442 Calculator --defines --locations --name-prefix=calc --verbose --yacc --yyerror-verbose + 54: calc.at:445 Calculator --debug --defines --locations --name-prefix=calc --verbose --yacc --yyerror-verbose +src/bison/tests % ./testsuite 51 -d +## --------------------------- ## +## GNU Bison 1.49a test suite. ## +## --------------------------- ## + 51: calc.at:440 ok +## ---------------------------- ## +## All 1 tests were successful. ## +## ---------------------------- ## +src/bison/tests % cd ./testsuite.dir/51 +tests/testsuite.dir/51 % echo "()" | ./calc +1.2-1.3: parse error, unexpected ')', expecting error or "number" or '-' or '(' * read_pipe.c This is not portable to DOS for instance. Implement a more portable diff --git a/tests/calc.at b/tests/calc.at index f813c462..ddc86464 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -99,7 +99,7 @@ exp: | exp '=' exp { if ($1 != $3) - printf ("calc: error: %d != %d\n", $1, $3); + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); $$ = $1 == $3; } | exp '+' exp { $$ = $1 + $3; } @@ -109,6 +109,7 @@ exp: | '-' exp %prec NEG { $$ = -$2; } | exp '^' exp { $$ = power ($1, $3); } | '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 0; } ; %% /* The input. */ @@ -118,7 +119,7 @@ static void yyerror (const char *s) { #if YYLSP_NEEDED - fprintf (stderr, "%d.%d:%d.%d: ", + fprintf (stderr, "%d.%d-%d.%d: ", yylloc.first_line, yylloc.first_column, yylloc.last_line, yylloc.last_column); #endif @@ -138,7 +139,7 @@ yygetc (void) if (res == '\n') { yylloc.last_line++; - yylloc.last_column = 0; + yylloc.last_column = 1; } else yylloc.last_column++; @@ -255,7 +256,7 @@ main (int argc, const char **argv) yydebug = 1; #endif #if YYLSP_NEEDED - yylloc.last_column = 0; + yylloc.last_column = 1; yylloc.last_line = 1; #endif yyparse (); @@ -318,22 +319,29 @@ m4_define([_AT_CHECK_CALC_ERROR], ]]) AT_CHECK([./calc input], 0, [], [stderr])]) +m4_bmatch([$1], [--debug], +[AT_CHECK([wc -l at-stderr +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +egrep -v '^((Start|Enter|Read|Reduc|Shift)ing|state|Error:|Next|Discarding) ' stderr >at-stderr mv at-stderr stderr - -AT_CHECK([cat stderr], 0, -[m4_bmatch([$1], [--location], [$4: ])[]dnl -parse error[]dnl -m4_bmatch([$1], [--yyerror-verbose], [, $5])[]dnl - +# 2. Create the reference error message. +AT_DATA([[expout]], +[$4 ]) - +# 3. If locations are not used, remove them. +m4_bmatch([$1], [--location], [], +[[sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout]]) +# 4. If error-verbose is not used, strip the`, unexpected....' part. +m4_bmatch([$1], [--yyerror-verbose], [], +[[sed 's/parse error, .*$/parse error/' expout >at-expout +mv at-expout expout]]) +# 5. Check +AT_CHECK([cat stderr], 0, [expout]) ]) @@ -371,29 +379,40 @@ _AT_CHECK_CALC([$1], # Some parse errors. _AT_CHECK_CALC_ERROR([$1], [0 0], [10], - [1.2:1.3], - [unexpected "number"]) + [1.3-1.4: parse error, unexpected "number"]) _AT_CHECK_CALC_ERROR([$1], [1//2], [13], - [1.2:1.3], - [unexpected '/', expecting "number" or '-' or '(']) + [1.3-1.4: parse error, unexpected '/', expecting "number" or '-' or '(']) _AT_CHECK_CALC_ERROR([$1], [error], [4], - [1.0:1.1], - [unexpected $undefined., expecting "number" or '-' or '\n' or '(']) + [1.1-1.2: parse error, unexpected $undefined., expecting "number" or '-' or '\n' or '(']) _AT_CHECK_CALC_ERROR([$1], [1 = 2 = 3], [19], - [1.6:1.7], - [unexpected '=']) + [1.7-1.8: parse error, unexpected '=']) _AT_CHECK_CALC_ERROR([$1], [ +1], [13], - [2.0:2.1], - [unexpected '+']) + [2.1-2.2: parse error, unexpected '+']) # Exercise error messages with EOF: work on an empty file. _AT_CHECK_CALC_ERROR([$1], [/dev/null], [4], - [1.0:1.1], - [unexpected "end of file", expecting "number" or '-' or '\n' or '(']) + [1.1-1.2: parse error, unexpected "end of file", expecting "number" or '-' or '\n' or '(']) + +# Exercise the error token: without it, we die at the first error, +# hence be sure i. to have several errors, ii. to test the action +# associated to `error'. +_AT_CHECK_CALC_ERROR([$1], + [(1 ++ 2) + (0 0) = 1], + [76], +[1.5-1.6: parse error, unexpected '+', expecting "number" or '-' or '(' +1.15-1.16: parse error, unexpected "number" +calc: error: 0 != 1]) + +# Add a studid example demonstrating that Bison can further improve the +# error message. FIXME: Fix this ridiculous message. +_AT_CHECK_CALC_ERROR([$1], + [()], + [21], +[1.2-1.3: parse error, unexpected ')', expecting error or "number" or '-' or '(']) AT_CLEANUP ])# AT_CHECK_CALC -- 2.45.2