Files
bison/tests/regression.at
Akim Demaille b365aa0589 * tests/regression.at (Unresolved SR Conflicts):
(Solved SR Conflicts, Rule Line Numbers): Adjust to the changes
below.
* src/LR0.c (new_state): Recognize the final state by the fact it
is reached by eoftoken.
(insert_start_shifting_state, insert_eof_shifting_state)
(insert_accepting_state, augment_automaton): Remove, since now
these states are automatically computed from the initial state.
(generate_states): Adjust.
* src/print.c: When reporting a rule number to the user, substract
1, so that the axiom rule is rule 0, and the first user rule is 1.
* src/reduce.c: Likewise.
* src/print_graph.c (print_core): For the time being, just as for
the report, depend upon --trace-flags to dump the full set of
items.
* src/reader.c (readgram): Once the grammar read, insert the rule
0: `$axiom: START-SYMBOL $'.
* tests/set.at: Adjust: rule 0 is now displayed, and since the
number of the states has changed (the final state is no longer
necessarily the last), catch up.
* tests/regression.at: Partly catch up.
2001-12-27 18:13:59 +00:00

845 lines
15 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Bison Regressions. -*- Autotest -*-
# Copyright 2001 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([[Regression tests.]])
## ------------------ ##
## Duplicate string. ##
## ------------------ ##
AT_SETUP([Duplicate string])
AT_DATA([input.y],
[[/* `Bison -v' used to dump core when two tokens are defined with the same
string, as LE and GE below. */
%token NUM
%token LE "<="
%token GE "<="
%%
exp: '(' exp ')' | NUM ;
%%
]])
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 4 $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 5 $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. ##
## ------------------- ##
AT_SETUP([Rule Line Numbers])
AT_DATA([input.y],
[[%%
expr:
'a'
{
}
'b'
{
}
|
{
}
'c'
{
}
]])
AT_CHECK([bison input.y -o input.c -v], 0, [], [])
# Check the contents of the report.
AT_CHECK([cat input.output], [],
[[Grammar
Number, Line, Rule
0 28 $axiom -> expr $
1 2 @1 -> /* empty */
2 2 expr -> 'a' @1 'b'
3 15 @2 -> /* empty */
4 15 expr -> @2 'c'
Terminals, with rules where they appear
$ (0) 0
'a' (97) 2
'b' (98) 2
'c' (99) 4
error (256)
Nonterminals, with rules where they appear
$axiom (6)
on left: 0
expr (7)
on left: 2 4, on right: 0
@1 (8)
on left: 1, on right: 2
@2 (9)
on left: 3, on right: 4
state 0
'a' shift, and go to state 1
expr go to state 2
@2 go to state 3
state 1
expr -> 'a' . @1 'b' (rule 2)
$default reduce using rule 1 (@1)
@1 go to state 4
state 2
$axiom -> expr . $ (rule 0)
$ shift, and go to state 5
state 3
expr -> @2 . 'c' (rule 4)
'c' shift, and go to state 6
state 4
expr -> 'a' @1 . 'b' (rule 2)
'b' shift, and go to state 7
state 5
$axiom -> expr $ . (rule 0)
$default accept
state 6
expr -> @2 'c' . (rule 4)
$default reduce using rule 4 (expr)
state 7
expr -> 'a' @1 'b' . (rule 2)
$default reduce using rule 2 (expr)
]])
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. ##
## ---------------------- ##
AT_SETUP([Mixing %token styles])
# Taken from the documentation.
AT_DATA([input.y],
[[%token <operator> OR "||"
%token <operator> LE 134 "<="
%left OR "<="
%%
exp: ;
%%
]])
AT_CHECK([bison -v input.y -o input.c], 0, ignore, ignore)
AT_CLEANUP
## ---------------------- ##
## %union and --defines. ##
## ---------------------- ##
AT_SETUP([%union and --defines])
AT_DATA([input.y],
[%union
{
int integer;
char *string ;
}
%%
exp: {};
])
AT_CHECK([bison --defines input.y])
AT_CLEANUP
## --------------------------------------- ##
## Duplicate '/' in C comments in %union ##
## --------------------------------------- ##
AT_SETUP([%union and C comments])
AT_DATA([input.y],
[%union
{
/* The int. */ int integer;
/* The string. */ char *string ;
}
%%
exp: {};
])
AT_CHECK([bison input.y -o input.c])
AT_CHECK([fgrep '//*' input.c], [1], [])
AT_CLEANUP
## ----------------- ##
## Invalid input 1. ##
## ----------------- ##
AT_SETUP([Invalid input: 1])
AT_DATA([input.y],
[[%%
?
]])
AT_CHECK([bison input.y], [1], [],
[[input.y:2: invalid input: `?'
input.y:3: fatal error: no rules in the input grammar
]])
AT_CLEANUP
## ----------------- ##
## Invalid input 2. ##
## ----------------- ##
AT_SETUP([Invalid input: 2])
AT_DATA([input.y],
[[%%
default: 'a' }
]])
AT_CHECK([bison input.y], [1], [],
[[input.y:2: invalid input: `}'
]])
AT_CLEANUP
## -------------------- ##
## Invalid %directive. ##
## -------------------- ##
AT_SETUP([Invalid %directive])
AT_DATA([input.y],
[[%invalid
]])
AT_CHECK([bison input.y], [1], [],
[[input.y:1: unrecognized: %invalid
input.y:1: Skipping to next %
input.y:2: fatal error: no input grammar
]])
AT_CLEANUP
## --------------------- ##
## Invalid CPP headers. ##
## --------------------- ##
# AT_TEST_CPP_GUARD_H([INPUT-FILE-BASE)
# -------------------------------------
m4_define([AT_TEST_CPP_GUARD_H],
[AT_SETUP([Invalid CPP guards: $1])
# Possibly create inner directories.
dirname=`AS_DIRNAME([$1])`
AS_MKDIR_P([$dirname])
AT_DATA([$1.y],
[%%
dummy:
])
AT_CHECK([bison --defines=$1.h $1.y])
# CPP should be happy with it.
AT_CHECK([$CC -E $1.h], 0, [ignore])
AT_CLEANUP
])
AT_TEST_CPP_GUARD_H([input/input])
AT_TEST_CPP_GUARD_H([9foo])
## -------------- ##
## Web2c Report. ##
## -------------- ##
# The generation of the reduction was once wrong in Bison, and made it
# miss some reductions. In the following test case, the reduction on
# `undef_id_tok' in state 1 was missing. This is stripped down from
# the actual web2c.y.
AT_SETUP([Web2c Report])
AT_DATA([input.y],
[[%token undef_id_tok const_id_tok
%start CONST_DEC_PART
%%
CONST_DEC_PART:
CONST_DEC_LIST
;
CONST_DEC_LIST:
CONST_DEC
| CONST_DEC_LIST CONST_DEC
;
CONST_DEC:
{ } undef_id_tok '=' const_id_tok ';'
;
%%
]])
AT_CHECK([bison -v input.y])
AT_CHECK([sed -n 's/ *$//;/^$/!p' input.output], 0,
[[Grammar
Number, Line, Rule
1 6 CONST_DEC_PART -> CONST_DEC_LIST
2 10 CONST_DEC_LIST -> CONST_DEC
3 12 CONST_DEC_LIST -> CONST_DEC_LIST CONST_DEC
4 15 @1 -> /* empty */
5 15 CONST_DEC -> @1 undef_id_tok '=' const_id_tok ';'
Terminals, with rules where they appear
$ (0)
';' (59) 5
'=' (61) 5
error (256)
undef_id_tok (257) 5
const_id_tok (258) 5
Nonterminals, with rules where they appear
CONST_DEC_PART (7)
on left: 1
CONST_DEC_LIST (8)
on left: 2 3, on right: 1 3
CONST_DEC (9)
on left: 5, on right: 2 3
@1 (10)
on left: 4, on right: 5
state 0
$default reduce using rule 4 (@1)
CONST_DEC_PART go to state 9
CONST_DEC_LIST go to state 1
CONST_DEC go to state 2
@1 go to state 3
state 1
CONST_DEC_PART -> CONST_DEC_LIST . (rule 1)
CONST_DEC_LIST -> CONST_DEC_LIST . CONST_DEC (rule 3)
undef_id_tok reduce using rule 4 (@1)
$default reduce using rule 1 (CONST_DEC_PART)
CONST_DEC go to state 4
@1 go to state 3
state 2
CONST_DEC_LIST -> CONST_DEC . (rule 2)
$default reduce using rule 2 (CONST_DEC_LIST)
state 3
CONST_DEC -> @1 . undef_id_tok '=' const_id_tok ';' (rule 5)
undef_id_tok shift, and go to state 5
state 4
CONST_DEC_LIST -> CONST_DEC_LIST CONST_DEC . (rule 3)
$default reduce using rule 3 (CONST_DEC_LIST)
state 5
CONST_DEC -> @1 undef_id_tok . '=' const_id_tok ';' (rule 5)
'=' shift, and go to state 6
state 6
CONST_DEC -> @1 undef_id_tok '=' . const_id_tok ';' (rule 5)
const_id_tok shift, and go to state 7
state 7
CONST_DEC -> @1 undef_id_tok '=' const_id_tok . ';' (rule 5)
';' shift, and go to state 8
state 8
CONST_DEC -> @1 undef_id_tok '=' const_id_tok ';' . (rule 5)
$default reduce using rule 5 (CONST_DEC)
state 9
$ shift, and go to state 10
state 10
$default accept
]])
AT_CLEANUP
## --------------- ##
## Web2c Actions. ##
## --------------- ##
# The generation of the mapping `state -> action' was once wrong in
# extremely specific situations. web2c.y exhibits this situation.
# Below is a stripped version of the grammar. It looks like one can
# simplify it further, but just don't: it is tuned to exhibit a bug,
# which disapears when applying sane grammar transformations.
#
# It used to be wrong on yydefact only:
#
# static const short yydefact[] =
# {
# - 2, 0, 1, 0, 0, 2, 3, 2, 5, 4,
# + 2, 0, 1, 0, 0, 0, 3, 2, 5, 4,
# 0, 0
# };
#
# but let's check all the tables.
AT_SETUP([Web2c Actions])
AT_DATA([input.y],
[[%%
statement: struct_stat;
struct_stat: /* empty. */ | if else;
if: "if" "const" "then" statement;
else: "else" statement;
%%
]])
AT_CHECK([bison -v input.y -o input.c])
# Check only the tables. We don't use --no-parser, because it is
# still to be implemented in the experimental branch of Bison.
AT_CHECK([[sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c]], 0,
[[static const char yytranslate[] =
{
0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 3, 4, 5,
6
};
static const short yyprhs[] =
{
0, 0, 2, 3, 6, 11
};
static const short yyrhs[] =
{
8, 0, 0, 9, 10, 0, 3, 4, 5, 7,
0, 6, 7, 0
};
static const short yyrline[] =
{
0, 2, 3, 3, 4, 5
};
static const char *const yytname[] =
{
"$", "error", "$undefined.", "\"if\"", "\"const\"", "\"then\"",
"\"else\"", "statement", "struct_stat", "if", "else", NULL
};
static const short yytoknum[] =
{
0, 256, 2, 257, 258, 259, 260, -1
};
static const short yyr1[] =
{
0, 7, 8, 8, 9, 10
};
static const short yyr2[] =
{
0, 1, 0, 2, 4, 2
};
static const short yydefact[] =
{
2, 0, 1, 0, 0, 2, 3, 2, 5, 4,
0, 0
};
static const short yydefgoto[] =
{
8, 2, 3, 6
};
static const short yypact[] =
{
-2, -1,-32768, -4, 1, -2,-32768, -2,-32768,-32768,
4,-32768
};
static const short yypgoto[] =
{
0,-32768,-32768,-32768
};
static const short yytable[] =
{
10, 1, 5, 4, 11, 0, 7, 9
};
static const short yycheck[] =
{
0, 3, 6, 4, 0, -1, 5, 7
};
]])
AT_CLEANUP