mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-10 21:03:04 +00:00
* 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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user