]> git.saurik.com Git - bison.git/commitdiff
* tests/calc.at (_AT_CHECK_CALC_ERROR): Receive as argument the
authorAkim Demaille <akim@epita.fr>
Tue, 9 Apr 2002 19:20:10 +0000 (19:20 +0000)
committerAkim Demaille <akim@epita.fr>
Tue, 9 Apr 2002 19:20:10 +0000 (19:20 +0000)
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
TODO
tests/calc.at

index 062207775cea5920ec6cf23329c40b8d81d43b0b..f4d5d46c3d8106ae5520eb7c082c90e31c70b5c4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2002-04-09  Akim Demaille  <akim@epita.fr>
+
+       * 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  <akim@epita.fr>
 
        * src/gram.h, src/gram.c (error_token_number): Remove, use
diff --git a/TODO b/TODO
index 02f6b15b162e7faf22f96d99f0e310a86d8c3b44..ae6c3972124b09ec54432385f8894ae70332128a 100644 (file)
--- 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
index f813c462949857c2118c3a6866e8a3b409aa9e67..ddc86464cdf823626e2a82a53742060457d59bf3 100644 (file)
@@ -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 <stderr | sed 's/[[^0-9]]//g'], 0, [$3
+])])
 
-AT_CHECK([wc -l <stderr | sed 's/[[^0-9]]//g'], 0,
-         [m4_bmatch([$1], [--debug],
-                    [$3], [1])
-])
-
-egrep -v '^((Start|Enter|Read|Reduc|Shift)ing|state|Error:) ' stderr >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