* 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.
This commit is contained in:
Akim Demaille
2002-04-09 19:20:10 +00:00
parent 007a50a493
commit 51dec47b37
3 changed files with 84 additions and 33 deletions

View File

@@ -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

27
TODO
View File

@@ -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

View 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