Make the test suite pass with warnings checked.

* tests/actions.at (Printers and Destructors): Improve.
Avoid unsigned vs. signed issues.
* tests/calc.at: Don't exercise the scanner here, do it...
* tests/input.at (Torturing the Scanner): here.
This commit is contained in:
Akim Demaille
2002-06-30 17:27:14 +00:00
parent 720623af84
commit 5a08f1ce21
4 changed files with 141 additions and 71 deletions

View File

@@ -1,3 +1,13 @@
2002-06-30 Akim Demaille <akim@epita.fr>
Make the test suite pass with warnings checked.
* tests/actions.at (Printers and Destructors): Improve.
Avoid unsigned vs. signed issues.
* tests/calc.at: Don't exercise the scanner here, do it...
* tests/input.at (Torturing the Scanner): here.
2002-06-28 Paul Hilfinger <Hilfinger@CS.Berkeley.EDU> 2002-06-28 Paul Hilfinger <Hilfinger@CS.Berkeley.EDU>
* data/glr.c: Correct typo in Emacs-mode directive. Slightly * data/glr.c: Correct typo in Emacs-mode directive. Slightly

View File

@@ -193,7 +193,6 @@ AT_DATA([[input.y]],
%{ %{
static int yylex (void); static int yylex (void);
static void yyerror (const char *msg); static void yyerror (const char *msg);
static void yyprint (FILE *out, int num, YYSTYPE val);
%} %}
@@ -252,21 +251,22 @@ yylex (void)
can be reduced. */ can be reduced. */
'x', 'x', 'x', 'x', 'x', 'x', ';', 'x', 'x', 'x', 'x', 'x', 'x', ';',
/* Load the stack and provoke an error that cannot be caught be /* Load the stack and provoke an error that cannot be caught by
the grammar, and check that the stack is cleared. */ the grammar, to check that the stack is cleared. */
'x', 'x', ';', 'x', 'x', ';',
'x', ';', 'x', ';',
'y' 'y'
}; };
static int counter = 0; static unsigned int counter = 0;
if (counter < (sizeof(input) / sizeof (input[0]))) if (counter < (sizeof(input) / sizeof (input[0])))
{ {
yylval.ival = counter; yylval.ival = counter;
printf ("sending: '%c' (line %d)\n", input[counter], counter);
/* As in BASIC, line numbers go from 10 to 10. */ /* As in BASIC, line numbers go from 10 to 10. */
yylloc.first_line = 10 * counter; yylloc.first_line = 10 * counter;
return input[counter++]; printf ("sending: '%c' (value = %d, line %d)\n",
input[counter], yylval.ival, yylloc.first_line);
return (int) input[counter++];
} }
else else
{ {
@@ -298,35 +298,35 @@ main (void)
AT_CHECK([bison input.y --location -d -v -o input.c]) AT_CHECK([bison input.y --location -d -v -o input.c])
AT_CHECK([$CC $CFLAGS $CPPFLAGS input.c -o input], 0, [], [ignore]) AT_CHECK([$CC $CFLAGS $CPPFLAGS input.c -o input], 0, [], [ignore])
AT_CHECK([./input], 1, AT_CHECK([./input], 1,
[[sending: 'x' (line 0) [[sending: 'x' (value = 0, line 0)
thing(0): 'x'(0) thing(0): 'x'(0)
sending: 'x' (line 1) sending: 'x' (value = 1, line 10)
thing(1): 'x'(1) thing(1): 'x'(1)
sending: 'x' (line 2) sending: 'x' (value = 2, line 20)
thing(2): 'x'(2) thing(2): 'x'(2)
sending: 'x' (line 3) sending: 'x' (value = 3, line 30)
30: parse error, unexpected 'x', expecting ';' 30: parse error, unexpected 'x', expecting ';'
Freeing nterm thing (2 from 20) Freeing nterm thing (2 from 20)
Freeing nterm thing (1 from 10) Freeing nterm thing (1 from 10)
Freeing nterm thing (0 from 0) Freeing nterm thing (0 from 0)
Freeing token 'x' (3 from 30) Freeing token 'x' (3 from 30)
sending: 'x' (line 4) sending: 'x' (value = 4, line 40)
Freeing token 'x' (4 from 40) Freeing token 'x' (4 from 40)
sending: 'x' (line 5) sending: 'x' (value = 5, line 50)
Freeing token 'x' (5 from 50) Freeing token 'x' (5 from 50)
sending: ';' (line 6) sending: ';' (value = 6, line 60)
line(-1): error ';' line(-1): error ';'
sending: 'x' (line 7) sending: 'x' (value = 7, line 70)
thing(7): 'x'(7) thing(7): 'x'(7)
sending: 'x' (line 8) sending: 'x' (value = 8, line 80)
thing(8): 'x'(8) thing(8): 'x'(8)
sending: ';' (line 9) sending: ';' (value = 9, line 90)
line(7): thing(7) thing(8) ';' line(7): thing(7) thing(8) ';'
sending: 'x' (line 10) sending: 'x' (value = 10, line 100)
thing(10): 'x'(10) thing(10): 'x'(10)
sending: ';' (line 11) sending: ';' (value = 11, line 110)
line(10): thing(10) ';' line(10): thing(10) ';'
sending: 'y' (line 12) sending: 'y' (value = 12, line 120)
120: parse error, unexpected $undefined., expecting $ or error or 'x' 120: parse error, unexpected $undefined., expecting $ or error or 'x'
sending: EOF sending: EOF
Freeing nterm line (10 from 100) Freeing nterm line (10 from 100)

View File

@@ -67,30 +67,17 @@ typedef int value_t;
%} %}
/* Exercise M4 quoting: '@:>@@:>@', 0. */ /* Exercise %union. */
/* Also exercise %union. */
%union %union
{ {
value_t ival; /* A comment to exercise an old bug. */ value_t ival;
}; };
/* Exercise post-prologue dependency to %union. */
%{
static void id (YYSTYPE *lval);
/* Exercise quotes in declarations. */
char quote[] = "@:>@@:>@,";
%}
/* Bison Declarations */ /* Bison Declarations */
%token CALC_EOF 0 "end of file" %token CALC_EOF 0 "end of file"
%token <ival> NUM "number" %token <ival> NUM "number"
%type <ival> exp %type <ival> exp
/* Exercise quotes in strings. */
%token FAKE "fake @>:@@>:@,"
%nonassoc '=' /* comparison */ %nonassoc '=' /* comparison */
%left '-' '+' %left '-' '+'
%left '*' '/' %left '*' '/'
@@ -107,15 +94,10 @@ input:
; ;
line: line:
'\n' '\n' {}
| exp '\n' | exp '\n' {}
{
/* Exercise quotes in braces. */
char tmp[] = "@>:@@:>@,";
}
; ;
/* Exercise M4 quoting: '@:>@@:>@', 1. */
exp: exp:
NUM { $$ = $1; } NUM { $$ = $1; }
| exp '=' exp | exp '=' exp
@@ -137,7 +119,6 @@ exp:
/* The input. */ /* The input. */
FILE *yyin; FILE *yyin;
/* Exercise M4 quoting: '@:>@@:>@', 2. */
static void static void
yyerror (const char *s) yyerror (const char *s)
{ {
@@ -259,11 +240,6 @@ power (int base, int exponent)
return res; return res;
} }
void
id (YYSTYPE* lval)
{
}
int int
main (int argc, const char **argv) main (int argc, const char **argv)
{ {

View File

@@ -21,30 +21,6 @@ AT_BANNER([[Input Processing.]])
# Mostly test that we are robust to mistakes. # Mostly test that we are robust to mistakes.
## ----------------------- ##
## Torturing the Scanner. ##
## ----------------------- ##
AT_SETUP([Torturing the Scanner])
AT_DATA([input.y],
[[%{
/* This is seen in GCC: a %{ and %} in middle of a comment. */
const char *foo = "So %{ and %} can be here.";
%}
/* %{ and %} can be here too. */
%%
exp: 'a';
]])
AT_CHECK([bison input.y])
AT_CLEANUP
## ------------ ## ## ------------ ##
## Invalid $n. ## ## Invalid $n. ##
## ------------ ## ## ------------ ##
@@ -104,3 +80,111 @@ input.y:6.4: empty rule for typed nonterminal, and no action
]]) ]])
AT_CLEANUP AT_CLEANUP
## ----------------------- ##
## Torturing the Scanner. ##
## ----------------------- ##
# Be sure to compile and run, so that the C compiler checks what
# we do.
AT_SETUP([Torturing the Scanner])
AT_DATA([input.y],
[[%{
/* This is seen in GCC: a %{ and %} in middle of a comment. */
const char *foo = "So %{ and %} can be here too.";
#include <stdio.h>
%}
/* %{ and %} can be here too. */
%{
/* Exercise pre-prologue dependency to %union. */
typedef int value_t;
%}
/* Exercise M4 quoting: '@:>@@:>@', 0. */
/* Also exercise %union. */
%union
{
value_t ival; /* A comment to exercise an old bug. */
};
/* Exercise post-prologue dependency to %union. */
%{
static YYSTYPE value_t_as_yystype (value_t val);
/* Exercise quotes in declarations. */
char quote[] = "@:>@@:>@,";
%}
%{
static void yyerror (const char *s);
static int yylex (void);
%}
%type <ival> '1'
/* Exercise quotes in strings. */
%token FAKE "fake @<:@@:>@,"
%%
/* Exercise M4 quoting: '@:>@@:>@', 1. */
exp: '1'
{
/* Exercise quotes in braces. */
char tmp[] = "@<:@%c@:>@,\n";
printf (tmp, $1);
}
;
%%
/* Exercise M4 quoting: '@:>@@:>@', 2. */
static YYSTYPE
value_t_as_yystype (value_t val)
{
YYSTYPE res;
res.ival = val;
return res;
}
static int
yylex (void)
{
static const char *input = "1";
yylval = value_t_as_yystype (*input);
return *input++;
}
static void
yyerror (const char *msg)
{
fprintf (stderr, "%s\n", msg);
}
]])
AT_DATA([main.c],
[[typedef int value_t;
#include "input.h"
int yyparse (void);
int
main (void)
{
return yyparse ();
}
]])
AT_CHECK([bison input.y -d -v -o input.c])
AT_CHECK([$CC $CFLAGS $CPPFLAGS main.c input.c -o input], 0, [], [ignore])
AT_CHECK([./input], 0,
[[[1],
]])
AT_CLEANUP