* tests/regression.at (%nonassoc and eof, Unresolved SR Conflicts)

(Solved SR Conflicts, %expect not enough, %expect right)
(%expect too much): Move to...
* tests/conflicts.at: this new file.
This commit is contained in:
Akim Demaille
2002-03-19 08:10:21 +00:00
parent 0d8bed5636
commit 3c31a486e7
5 changed files with 396 additions and 343 deletions

View File

@@ -1,3 +1,10 @@
2002-03-19 Akim Demaille <akim@epita.fr>
* tests/regression.at (%nonassoc and eof, Unresolved SR Conflicts)
(Solved SR Conflicts, %expect not enough, %expect right)
(%expect too much): Move to...
* tests/conflicts.at: this new file.
2002-03-19 Akim Demaille <akim@epita.fr>
* data/m4sugar/m4sugar.m4: Update from CVS Autoconf.

View File

@@ -47,7 +47,7 @@ TESTSUITE_AT = \
testsuite.at \
input.at \
output.at sets.at reduce.at \
headers.at actions.at calc.at \
headers.at actions.at conflicts.at calc.at \
torture.at regression.at \
semantic.at

363
tests/conflicts.at Normal file
View File

@@ -0,0 +1,363 @@
# Exercising Bison on conflicts. -*- Autotest -*-
# Copyright 2002 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
AT_BANNER([[Conflicts.]])
## ------------------- ##
## %nonassoc and eof. ##
## ------------------- ##
AT_SETUP([%nonassoc and eof])
AT_DATA([input.y],
[[
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <error.h>
#define YYERROR_VERBOSE 1
#define yyerror(Msg) \
do { \
fprintf (stderr, "%s\n", Msg); \
exit (1); \
} while (0)
/* The current argument. */
static const char *input = NULL;
static int
yylex (void)
{
/* No token stands for end of file. */
if (input && *input)
return *input++;
else
return 0;
}
%}
%nonassoc '<' '>'
%%
expr: expr '<' expr
| expr '>' expr
| '0'
;
%%
int
main (int argc, const char *argv[])
{
if (argc > 1)
input = argv[1];
return yyparse ();
}
]])
# Specify the output files to avoid problems on different file systems.
AT_CHECK([bison input.y -o input.c])
AT_CHECK([$CC $CFLAGS $CPPFLAGS input.c -o input], 0, [], [ignore])
AT_CHECK([./input '0<0'])
# FIXME: This is an actual bug, but a new one, in the sense that
# no one has ever spotted it! The messages are *wrong*: there should
# be nothing there, it should be expected eof.
AT_CHECK([./input '0<0<0'], [1], [],
[parse error, unexpected '<', expecting '<' or '>'
])
AT_CHECK([./input '0>0'])
AT_CHECK([./input '0>0>0'], [1], [],
[parse error, unexpected '>', expecting '<' or '>'
])
AT_CHECK([./input '0<0>0'], [1], [],
[parse error, unexpected '>', expecting '<' or '>'
])
AT_CLEANUP
## ------------------------- ##
## Unresolved SR Conflicts. ##
## ------------------------- ##
AT_SETUP([Unresolved SR Conflicts])
AT_DATA([input.y],
[[%token NUM OP
%%
exp: exp OP exp | NUM;
]])
AT_CHECK([bison input.y -o input.c -v], 0, [],
[input.y contains 1 shift/reduce conflict.
])
# Check the contents of the report.
AT_CHECK([cat input.output], [],
[[State 5 contains 1 shift/reduce conflict.
Grammar
Number, Line, Rule
0 3 $axiom -> exp $
1 3 exp -> exp OP exp
2 3 exp -> NUM
Terminals, with rules where they appear
$ (0) 0
error (256)
NUM (257) 2
OP (258) 1
Nonterminals, with rules where they appear
$axiom (5)
on left: 0
exp (6)
on left: 1 2, on right: 0 1
state 0
NUM shift, and go to state 1
exp go to state 2
state 1
exp -> NUM . (rule 2)
$default reduce using rule 2 (exp)
state 2
$axiom -> exp . $ (rule 0)
exp -> exp . OP exp (rule 1)
$ shift, and go to state 3
OP shift, and go to state 4
state 3
$axiom -> exp $ . (rule 0)
$default accept
state 4
exp -> exp OP . exp (rule 1)
NUM shift, and go to state 1
exp go to state 5
state 5
exp -> exp . OP exp (rule 1)
exp -> exp OP exp . (rule 1)
OP shift, and go to state 4
OP [reduce using rule 1 (exp)]
$default reduce using rule 1 (exp)
]])
AT_CLEANUP
## --------------------- ##
## Solved SR Conflicts. ##
## --------------------- ##
AT_SETUP([Solved SR Conflicts])
AT_DATA([input.y],
[[%token NUM OP
%right OP
%%
exp: exp OP exp | NUM;
]])
AT_CHECK([bison input.y -o input.c -v], 0, [], [])
# Check the contents of the report.
AT_CHECK([cat input.output], [],
[[Conflict in state 5 between rule 2 and token OP resolved as shift.
Grammar
Number, Line, Rule
0 4 $axiom -> exp $
1 4 exp -> exp OP exp
2 4 exp -> NUM
Terminals, with rules where they appear
$ (0) 0
error (256)
NUM (257) 2
OP (258) 1
Nonterminals, with rules where they appear
$axiom (5)
on left: 0
exp (6)
on left: 1 2, on right: 0 1
state 0
NUM shift, and go to state 1
exp go to state 2
state 1
exp -> NUM . (rule 2)
$default reduce using rule 2 (exp)
state 2
$axiom -> exp . $ (rule 0)
exp -> exp . OP exp (rule 1)
$ shift, and go to state 3
OP shift, and go to state 4
state 3
$axiom -> exp $ . (rule 0)
$default accept
state 4
exp -> exp OP . exp (rule 1)
NUM shift, and go to state 1
exp go to state 5
state 5
exp -> exp . OP exp (rule 1)
exp -> exp OP exp . (rule 1)
OP shift, and go to state 4
$default reduce using rule 1 (exp)
]])
AT_CLEANUP
## -------------------- ##
## %expect not enough. ##
## -------------------- ##
AT_SETUP([%expect not enough])
AT_DATA([input.y],
[[%token NUM OP
%expect 0
%%
exp: exp OP exp | NUM;
]])
AT_CHECK([bison input.y -o input.c], 1, [],
[input.y contains 1 shift/reduce conflict.
expected 0 shift/reduce conflicts
])
AT_CLEANUP
## --------------- ##
## %expect right. ##
## --------------- ##
AT_SETUP([%expect right])
AT_DATA([input.y],
[[%token NUM OP
%expect 1
%%
exp: exp OP exp | NUM;
]])
AT_CHECK([bison input.y -o input.c], 0)
AT_CLEANUP
## ------------------ ##
## %expect too much. ##
## ------------------ ##
AT_SETUP([%expect too much])
AT_DATA([input.y],
[[%token NUM OP
%expect 2
%%
exp: exp OP exp | NUM;
]])
AT_CHECK([bison input.y -o input.c], 1, [],
[input.y contains 1 shift/reduce conflict.
expected 2 shift/reduce conflicts
])
AT_CLEANUP

View File

@@ -1,5 +1,5 @@
# Bison Regressions. -*- Autotest -*-
# Copyright 2001 Free Software Foundation, Inc.
# Copyright 2001, 2002 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -19,79 +19,6 @@
AT_BANNER([[Regression tests.]])
## ------------------- ##
## %nonassoc and eof. ##
## ------------------- ##
AT_SETUP([%nonassoc and eof])
AT_DATA([input.y],
[[
%{
#include <stdio.h>
#define YYERROR_VERBOSE 1
#define yyerror(Msg) \
do { \
fprintf (stderr, "%s\n", Msg); \
exit (1); \
} while (0)
/* The current argument. */
static const char *input = NULL;
static int
yylex (void)
{
/* No token stands for end of file. */
if (input && *input)
return *input++;
else
return 0;
}
%}
%nonassoc '<' '>'
%%
expr: expr '<' expr
| expr '>' expr
| '0'
;
%%
int
main (int argc, const char *argv[])
{
if (argc > 1)
input = argv[1];
return yyparse ();
}
]])
# Specify the output files to avoid problems on different file systems.
AT_CHECK([bison input.y -o input.c])
AT_CHECK([$CC $CFLAGS $CPPFLAGS input.c -o input], 0, [], [ignore])
AT_CHECK([./input '0<0'])
# FIXME: This is an actual bug, but a new one, in the sense that
# no one has ever spotted it! The messages are *wrong*: there should
# be nothing there, it should be expected eof.
AT_CHECK([./input '0<0<0'], [1], [],
[parse error, unexpected '<', expecting '<' or '>'
])
AT_CHECK([./input '0>0'])
AT_CHECK([./input '0>0>0'], [1], [],
[parse error, unexpected '>', expecting '<' or '>'
])
AT_CHECK([./input '0<0>0'], [1], [],
[parse error, unexpected '>', expecting '<' or '>'
])
AT_CLEANUP
## ---------------- ##
## Braces parsing. ##
## ---------------- ##
@@ -139,216 +66,6 @@ AT_CHECK([bison -v input.y -o input.c], 0, ignore, ignore)
AT_CLEANUP
## ------------------------- ##
## Unresolved SR Conflicts. ##
## ------------------------- ##
AT_SETUP([Unresolved SR Conflicts])
AT_DATA([input.y],
[[%token NUM OP
%%
exp: exp OP exp | NUM;
]])
AT_CHECK([bison input.y -o input.c -v], 0, [],
[input.y contains 1 shift/reduce conflict.
])
# Check the contents of the report.
AT_CHECK([cat input.output], [],
[[State 5 contains 1 shift/reduce conflict.
Grammar
Number, Line, Rule
0 3 $axiom -> exp $
1 3 exp -> exp OP exp
2 3 exp -> NUM
Terminals, with rules where they appear
$ (0) 0
error (256)
NUM (257) 2
OP (258) 1
Nonterminals, with rules where they appear
$axiom (5)
on left: 0
exp (6)
on left: 1 2, on right: 0 1
state 0
NUM shift, and go to state 1
exp go to state 2
state 1
exp -> NUM . (rule 2)
$default reduce using rule 2 (exp)
state 2
$axiom -> exp . $ (rule 0)
exp -> exp . OP exp (rule 1)
$ shift, and go to state 3
OP shift, and go to state 4
state 3
$axiom -> exp $ . (rule 0)
$default accept
state 4
exp -> exp OP . exp (rule 1)
NUM shift, and go to state 1
exp go to state 5
state 5
exp -> exp . OP exp (rule 1)
exp -> exp OP exp . (rule 1)
OP shift, and go to state 4
OP [reduce using rule 1 (exp)]
$default reduce using rule 1 (exp)
]])
AT_CLEANUP
## --------------------- ##
## Solved SR Conflicts. ##
## --------------------- ##
AT_SETUP([Solved SR Conflicts])
AT_DATA([input.y],
[[%token NUM OP
%right OP
%%
exp: exp OP exp | NUM;
]])
AT_CHECK([bison input.y -o input.c -v], 0, [], [])
# Check the contents of the report.
AT_CHECK([cat input.output], [],
[[Conflict in state 5 between rule 2 and token OP resolved as shift.
Grammar
Number, Line, Rule
0 4 $axiom -> exp $
1 4 exp -> exp OP exp
2 4 exp -> NUM
Terminals, with rules where they appear
$ (0) 0
error (256)
NUM (257) 2
OP (258) 1
Nonterminals, with rules where they appear
$axiom (5)
on left: 0
exp (6)
on left: 1 2, on right: 0 1
state 0
NUM shift, and go to state 1
exp go to state 2
state 1
exp -> NUM . (rule 2)
$default reduce using rule 2 (exp)
state 2
$axiom -> exp . $ (rule 0)
exp -> exp . OP exp (rule 1)
$ shift, and go to state 3
OP shift, and go to state 4
state 3
$axiom -> exp $ . (rule 0)
$default accept
state 4
exp -> exp OP . exp (rule 1)
NUM shift, and go to state 1
exp go to state 5
state 5
exp -> exp . OP exp (rule 1)
exp -> exp OP exp . (rule 1)
OP shift, and go to state 4
$default reduce using rule 1 (exp)
]])
AT_CLEANUP
## ------------------- ##
## Rule Line Numbers. ##
## ------------------- ##
@@ -494,63 +211,6 @@ AT_CLEANUP
## -------------------- ##
## %expect not enough. ##
## -------------------- ##
AT_SETUP([%expect not enough])
AT_DATA([input.y],
[[%token NUM OP
%expect 0
%%
exp: exp OP exp | NUM;
]])
AT_CHECK([bison input.y -o input.c], 1, [],
[input.y contains 1 shift/reduce conflict.
expected 0 shift/reduce conflicts
])
AT_CLEANUP
## --------------- ##
## %expect right. ##
## --------------- ##
AT_SETUP([%expect right])
AT_DATA([input.y],
[[%token NUM OP
%expect 1
%%
exp: exp OP exp | NUM;
]])
AT_CHECK([bison input.y -o input.c], 0)
AT_CLEANUP
## ------------------ ##
## %expect too much. ##
## ------------------ ##
AT_SETUP([%expect too much])
AT_DATA([input.y],
[[%token NUM OP
%expect 2
%%
exp: exp OP exp | NUM;
]])
AT_CHECK([bison input.y -o input.c], 1, [],
[input.y contains 1 shift/reduce conflict.
expected 2 shift/reduce conflicts
])
AT_CLEANUP
## ---------------------- ##
## Mixing %token styles. ##
## ---------------------- ##

View File

@@ -1,7 +1,7 @@
# Process this file with autom4te to create testsuite. -*- Autotest -*-
# Test suite for GNU Bison.
# Copyright 2000, 2001 Free Software Foundation, Inc.
# Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -25,13 +25,36 @@ AT_INIT
AT_TESTED([bison])
# Testing resistance to user bugs.
m4_include([input.at])
# Testing output file names.
m4_include([output.at])
# Testing the part of the engine that computes FOLLOW etc.
m4_include([sets.at])
# Testing grammar reduction.
m4_include([reduce.at])
# Testing that headers are sane.
m4_include([headers.at])
# Testing that user actions are properly performed.
m4_include([actions.at])
# Testing conflicts detection and resolution.
m4_include([conflicts.at])
# Fulling testing (compilation and execution of the parser) on calc.
m4_include([calc.at])
# Torturing the stack expansion at runtime.
# Checking big, real world grammars.
m4_include([torture.at])
# Some old bugs.
m4_include([regression.at])
# Exercising bison.hairy, before it gets really removed...
m4_include([semantic.at])