mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
* doc/gpl-3.0.texi: New file. * doc/gpl.texi: Remove. * COPYING, GNUmakefile, HACKING, Makefile.am, Makefile.cfg: * Makefile.maint, NEWS, PACKAGING, README, README-alpha: * README-hacking, TODO, bootstrap, bootstrap.conf: * configure.ac, data/Makefile.am, data/README, data/bison.m4: * data/c++-skel.m4, data/c++.m4, data/c-skel.m4, data/c.m4: * data/glr.c, data/glr.cc, data/java-skel.m4, data/java.m4: * data/lalr1.cc, data/lalr1.java, data/location.cc: * data/push.c, data/yacc.c, data/m4sugar/m4sugar.m4: * djgpp/Makefile.maint, djgpp/README.in, djgpp/config.bat: * djgpp/config.sed, djgpp/config.site, djgpp/config_h.sed: * djgpp/djunpack.bat, djgpp/subpipe.c, djgpp/subpipe.h: * djgpp/testsuite.sed, doc/Makefile.am, doc/bison.texinfo: * doc/fdl.texi, doc/refcard.tex, etc/Makefile.am, etc/README: * etc/bench.pl.in, examples/Makefile.am, examples/extexi: * examples/calc++/Makefile.am, lib/Makefile.am, lib/abitset.c: * lib/abitset.h, lib/bbitset.h, lib/bitset.c, lib/bitset.h: * lib/bitset_stats.c, lib/bitset_stats.h, lib/bitsetv-print.c: * lib/bitsetv-print.h, lib/bitsetv.c, lib/bitsetv.h: * lib/ebitset.c, lib/ebitset.h, lib/get-errno.c: * lib/get-errno.h, lib/lbitset.c, lib/lbitset.h: * lib/libiberty.h, lib/main.c, lib/subpipe.c, lib/subpipe.h: * lib/timevar.c, lib/timevar.def, lib/timevar.h: * lib/vbitset.c, lib/vbitset.h, lib/yyerror.c: * m4/c-working.m4, m4/cxx.m4, m4/m4.m4, m4/subpipe.m4: * m4/timevar.m4, src/LR0.c, src/LR0.h, src/Makefile.am: * src/assoc.c, src/assoc.h, src/closure.c, src/closure.h: * src/complain.c, src/complain.h, src/conflicts.c: * src/conflicts.h, src/derives.c, src/derives.h, src/files.c: * src/files.h, src/flex-scanner.h, src/getargs.c: * src/getargs.h, src/gram.c, src/gram.h, src/graphviz.c: * src/lalr.c, src/lalr.h, src/location.c, src/location.h: * src/main.c, src/muscle_tab.c, src/muscle_tab.h: * src/nullable.c, src/nullable.h, src/output.c, src/output.h: * src/parse-gram.c, src/parse-gram.h, src/parse-gram.y: * src/print.c, src/print.h, src/print_graph.c: * src/print_graph.h, src/reader.c, src/reader.h, src/reduce.c: * src/reduce.h, src/relation.c, src/relation.h: * src/revision.h, src/scan-code.h, src/scan-code.l: * src/scan-gram.h, src/scan-gram.l, src/scan-skel.h: * src/scan-skel.l, src/state.c, src/state.h, src/symlist.c: * src/symlist.h, src/symtab.c, src/symtab.h, src/system.h: * src/tables.c, src/tables.h, src/uniqstr.c, src/uniqstr.h: * tests/Makefile.am, tests/actions.at, tests/c++.at: * tests/calc.at, tests/conflicts.at, tests/cxx-type.at: * tests/existing.at, tests/glr-regression.at: * tests/headers.at, tests/input.at, tests/java.at: * tests/local.at, tests/output.at, tests/push.at: * tests/reduce.at, tests/regression.at, tests/sets.at: * tests/skeletons.at, tests/synclines.at, tests/testsuite.at: * tests/torture.at: Update to GPLv3.
354 lines
7.7 KiB
Plaintext
354 lines
7.7 KiB
Plaintext
# Exercising Bison Grammar Reduction. -*- Autotest -*-
|
|
# Copyright (C) 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
|
|
# the Free Software Foundation, either version 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
|
|
|
AT_BANNER([[Grammar Reduction.]])
|
|
|
|
|
|
## ------------------- ##
|
|
## Useless Terminals. ##
|
|
## ------------------- ##
|
|
|
|
AT_SETUP([Useless Terminals])
|
|
|
|
AT_DATA([[input.y]],
|
|
[[%verbose
|
|
%output "input.c"
|
|
|
|
%token useless1
|
|
%token useless2
|
|
%token useless3
|
|
%token useless4
|
|
%token useless5
|
|
%token useless6
|
|
%token useless7
|
|
%token useless8
|
|
%token useless9
|
|
|
|
%token useful
|
|
%%
|
|
exp: useful;
|
|
]])
|
|
|
|
AT_CHECK([[bison input.y]])
|
|
|
|
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
|
|
[[Terminals which are not used
|
|
useless1
|
|
useless2
|
|
useless3
|
|
useless4
|
|
useless5
|
|
useless6
|
|
useless7
|
|
useless8
|
|
useless9
|
|
]])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
|
|
## ---------------------- ##
|
|
## Useless Nonterminals. ##
|
|
## ---------------------- ##
|
|
|
|
AT_SETUP([Useless Nonterminals])
|
|
|
|
AT_DATA([[input.y]],
|
|
[[%verbose
|
|
%output "input.c"
|
|
|
|
%nterm useless1
|
|
%nterm useless2
|
|
%nterm useless3
|
|
%nterm useless4
|
|
%nterm useless5
|
|
%nterm useless6
|
|
%nterm useless7
|
|
%nterm useless8
|
|
%nterm useless9
|
|
|
|
%token useful
|
|
%%
|
|
exp: useful;
|
|
]])
|
|
|
|
AT_CHECK([[bison input.y]], 0, [],
|
|
[[input.y: warning: 9 useless nonterminals
|
|
input.y:4.8-15: warning: useless nonterminal: useless1
|
|
input.y:5.8-15: warning: useless nonterminal: useless2
|
|
input.y:6.8-15: warning: useless nonterminal: useless3
|
|
input.y:7.8-15: warning: useless nonterminal: useless4
|
|
input.y:8.8-15: warning: useless nonterminal: useless5
|
|
input.y:9.8-15: warning: useless nonterminal: useless6
|
|
input.y:10.8-15: warning: useless nonterminal: useless7
|
|
input.y:11.8-15: warning: useless nonterminal: useless8
|
|
input.y:12.8-15: warning: useless nonterminal: useless9
|
|
]])
|
|
|
|
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
|
|
[[Useless nonterminals
|
|
useless1
|
|
useless2
|
|
useless3
|
|
useless4
|
|
useless5
|
|
useless6
|
|
useless7
|
|
useless8
|
|
useless9
|
|
]])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
|
|
## --------------- ##
|
|
## Useless Rules. ##
|
|
## --------------- ##
|
|
|
|
AT_SETUP([Useless Rules])
|
|
|
|
AT_KEYWORDS([report])
|
|
|
|
AT_DATA([[input.y]],
|
|
[[%verbose
|
|
%output "input.c"
|
|
%token useful
|
|
%%
|
|
exp: useful;
|
|
useless1: '1';
|
|
useless2: '2';
|
|
useless3: '3';
|
|
useless4: '4';
|
|
useless5: '5';
|
|
useless6: '6';
|
|
useless7: '7';
|
|
useless8: '8';
|
|
useless9: '9';
|
|
]])
|
|
|
|
AT_CHECK([[bison input.y]], 0, [],
|
|
[[input.y: warning: 9 useless nonterminals and 9 useless rules
|
|
input.y:6.1-8: warning: useless nonterminal: useless1
|
|
input.y:7.1-8: warning: useless nonterminal: useless2
|
|
input.y:8.1-8: warning: useless nonterminal: useless3
|
|
input.y:9.1-8: warning: useless nonterminal: useless4
|
|
input.y:10.1-8: warning: useless nonterminal: useless5
|
|
input.y:11.1-8: warning: useless nonterminal: useless6
|
|
input.y:12.1-8: warning: useless nonterminal: useless7
|
|
input.y:13.1-8: warning: useless nonterminal: useless8
|
|
input.y:14.1-8: warning: useless nonterminal: useless9
|
|
input.y:6.11-13: warning: useless rule: useless1: '1'
|
|
input.y:7.11-13: warning: useless rule: useless2: '2'
|
|
input.y:8.11-13: warning: useless rule: useless3: '3'
|
|
input.y:9.11-13: warning: useless rule: useless4: '4'
|
|
input.y:10.11-13: warning: useless rule: useless5: '5'
|
|
input.y:11.11-13: warning: useless rule: useless6: '6'
|
|
input.y:12.11-13: warning: useless rule: useless7: '7'
|
|
input.y:13.11-13: warning: useless rule: useless8: '8'
|
|
input.y:14.11-13: warning: useless rule: useless9: '9'
|
|
]])
|
|
|
|
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
|
|
[[Useless nonterminals
|
|
useless1
|
|
useless2
|
|
useless3
|
|
useless4
|
|
useless5
|
|
useless6
|
|
useless7
|
|
useless8
|
|
useless9
|
|
Terminals which are not used
|
|
'1'
|
|
'2'
|
|
'3'
|
|
'4'
|
|
'5'
|
|
'6'
|
|
'7'
|
|
'8'
|
|
'9'
|
|
Useless rules
|
|
2 useless1: '1'
|
|
3 useless2: '2'
|
|
4 useless3: '3'
|
|
5 useless4: '4'
|
|
6 useless5: '5'
|
|
7 useless6: '6'
|
|
8 useless7: '7'
|
|
9 useless8: '8'
|
|
10 useless9: '9'
|
|
]])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
|
|
## ------------------- ##
|
|
## Reduced Automaton. ##
|
|
## ------------------- ##
|
|
|
|
# Check that the automaton is that as the for the grammar reduced by
|
|
# hand.
|
|
|
|
AT_SETUP([Reduced Automaton])
|
|
|
|
AT_KEYWORDS([report])
|
|
|
|
# The non reduced grammar.
|
|
# ------------------------
|
|
AT_DATA([[not-reduced.y]],
|
|
[[/* A useless token. */
|
|
%token useless_token
|
|
/* A useful one. */
|
|
%token useful
|
|
%verbose
|
|
%output "not-reduced.c"
|
|
|
|
%%
|
|
|
|
exp: useful { /* A useful action. */ }
|
|
| non_productive { /* A non productive action. */ }
|
|
;
|
|
|
|
not_reachable: useful { /* A not reachable action. */ }
|
|
;
|
|
|
|
non_productive: non_productive useless_token
|
|
{ /* Another non productive action. */ }
|
|
;
|
|
%%
|
|
]])
|
|
|
|
AT_CHECK([[bison not-reduced.y]], 0, [],
|
|
[[not-reduced.y: warning: 2 useless nonterminals and 3 useless rules
|
|
not-reduced.y:14.1-13: warning: useless nonterminal: not_reachable
|
|
not-reduced.y:11.6-19: warning: useless nonterminal: non_productive
|
|
not-reduced.y:11.6-57: warning: useless rule: exp: non_productive
|
|
not-reduced.y:14.16-56: warning: useless rule: not_reachable: useful
|
|
not-reduced.y:17.17-18.63: warning: useless rule: non_productive: non_productive useless_token
|
|
]])
|
|
|
|
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
|
|
[[Useless nonterminals
|
|
not_reachable
|
|
non_productive
|
|
Terminals which are not used
|
|
useless_token
|
|
Useless rules
|
|
2 exp: non_productive
|
|
3 not_reachable: useful
|
|
4 non_productive: non_productive useless_token
|
|
]])
|
|
|
|
# The reduced grammar.
|
|
# --------------------
|
|
AT_DATA([[reduced.y]],
|
|
[[/* A useless token. */
|
|
%token useless_token
|
|
/* A useful one. */
|
|
%token useful
|
|
%verbose
|
|
%output "reduced.c"
|
|
|
|
%%
|
|
|
|
exp: useful { /* A useful action. */ }
|
|
// | non_productive { /* A non productive action. */ } */
|
|
;
|
|
|
|
//not_reachable: useful { /* A not reachable action. */ }
|
|
// ;
|
|
|
|
//non_productive: non_productive useless_token
|
|
// { /* Another non productive action. */ }
|
|
// ;
|
|
%%
|
|
]])
|
|
|
|
AT_CHECK([[bison reduced.y]])
|
|
|
|
# Comparing the parsers.
|
|
cp reduced.c expout
|
|
AT_CHECK([sed 's/not-reduced/reduced/g' not-reduced.c], 0, [expout])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
|
|
## ------------------- ##
|
|
## Underivable Rules. ##
|
|
## ------------------- ##
|
|
|
|
AT_SETUP([Underivable Rules])
|
|
|
|
AT_KEYWORDS([report])
|
|
|
|
AT_DATA([[input.y]],
|
|
[[%verbose
|
|
%output "input.c"
|
|
%token useful
|
|
%%
|
|
exp: useful | underivable;
|
|
underivable: indirection;
|
|
indirection: underivable;
|
|
]])
|
|
|
|
AT_CHECK([[bison input.y]], 0, [],
|
|
[[input.y: warning: 2 useless nonterminals and 3 useless rules
|
|
input.y:5.15-25: warning: useless nonterminal: underivable
|
|
input.y:6.14-24: warning: useless nonterminal: indirection
|
|
input.y:5.15-25: warning: useless rule: exp: underivable
|
|
input.y:6.14-24: warning: useless rule: underivable: indirection
|
|
input.y:7.14-24: warning: useless rule: indirection: underivable
|
|
]])
|
|
|
|
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
|
|
[[Useless nonterminals
|
|
underivable
|
|
indirection
|
|
Useless rules
|
|
2 exp: underivable
|
|
3 underivable: indirection
|
|
4 indirection: underivable
|
|
]])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
|
|
## ---------------- ##
|
|
## Empty Language. ##
|
|
## ---------------- ##
|
|
|
|
AT_SETUP([Empty Language])
|
|
|
|
AT_DATA([[input.y]],
|
|
[[%output "input.c"
|
|
%%
|
|
exp: exp;
|
|
]])
|
|
|
|
AT_CHECK([[bison input.y]], 1, [],
|
|
[[input.y: warning: 2 useless nonterminals and 2 useless rules
|
|
input.y:3.1-3: fatal error: start symbol exp does not derive any sentence
|
|
]])
|
|
|
|
AT_CLEANUP
|