mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-10 12:53:03 +00:00
See http://www.gnu.org/prep/maintain/maintain.html#Copyright-Notices * HACKING, Makefile.am, NEWS, PACKAGING, README, README-alpha: * TODO, bootstrap, bootstrap.conf: * build-aux/update-b4-copyright, cfg.mk, configure.ac: * 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/xslt/bison.xsl: * data/xslt/xml2dot.xsl, data/xslt/xml2text.xsl: * data/xslt/xml2xhtml.xsl, data/yacc.c, 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/bison.texinfo: * doc/refcard.tex, etc/README, etc/bench.pl.in: * examples/calc++/Makefile.am, examples/extexi: * 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/timevar.c: * lib/timevar.def, lib/timevar.h, lib/vbitset.c: * lib/vbitset.h, lib/yyerror.c, m4/bison-i18n.m4: * m4/c-working.m4, m4/cxx.m4, m4/subpipe.m4, m4/timevar.m4: * src/LR0.c: * src/LR0.h, 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/nullable.c, src/nullable.h: * src/output.c, src/output.h, src/parse-gram.y: * src/print-xml.c, src/print-xml.h, 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/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/actions.at, tests/atlocal.in, 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: * data/Makefile.am, data/location.cc, doc/Makefile.am, src/Makefile.am: * tests/Makefile.am, lib/Makefile.am, examples/Makefile.am: * etc/Makefile.am, m4/m4.m4, src/muscle_tab.c, src/muscle_tab.h: Don't use date ranges in copyright notices. Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
360 lines
8.4 KiB
Plaintext
360 lines
8.4 KiB
Plaintext
# Exercising Bison Grammar Reduction. -*- Autotest -*-
|
|
|
|
# Copyright (C) 2001, 2002, 2007, 2008, 2009, 2010 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_BISON_CHECK([[input.y]])
|
|
|
|
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
|
|
[[Terminals unused in grammar
|
|
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_BISON_CHECK([[input.y]], 0, [],
|
|
[[input.y: warning: 9 nonterminals useless in grammar
|
|
input.y:4.8-15: warning: nonterminal useless in grammar: useless1
|
|
input.y:5.8-15: warning: nonterminal useless in grammar: useless2
|
|
input.y:6.8-15: warning: nonterminal useless in grammar: useless3
|
|
input.y:7.8-15: warning: nonterminal useless in grammar: useless4
|
|
input.y:8.8-15: warning: nonterminal useless in grammar: useless5
|
|
input.y:9.8-15: warning: nonterminal useless in grammar: useless6
|
|
input.y:10.8-15: warning: nonterminal useless in grammar: useless7
|
|
input.y:11.8-15: warning: nonterminal useless in grammar: useless8
|
|
input.y:12.8-15: warning: nonterminal useless in grammar: useless9
|
|
]])
|
|
|
|
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
|
|
[[Nonterminals useless in grammar
|
|
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_BISON_CHECK([[input.y]], 0, [],
|
|
[[input.y: warning: 9 nonterminals useless in grammar
|
|
input.y: warning: 9 rules useless in grammar
|
|
input.y:6.1-8: warning: nonterminal useless in grammar: useless1
|
|
input.y:7.1-8: warning: nonterminal useless in grammar: useless2
|
|
input.y:8.1-8: warning: nonterminal useless in grammar: useless3
|
|
input.y:9.1-8: warning: nonterminal useless in grammar: useless4
|
|
input.y:10.1-8: warning: nonterminal useless in grammar: useless5
|
|
input.y:11.1-8: warning: nonterminal useless in grammar: useless6
|
|
input.y:12.1-8: warning: nonterminal useless in grammar: useless7
|
|
input.y:13.1-8: warning: nonterminal useless in grammar: useless8
|
|
input.y:14.1-8: warning: nonterminal useless in grammar: useless9
|
|
input.y:6.11-13: warning: rule useless in grammar: useless1: '1'
|
|
input.y:7.11-13: warning: rule useless in grammar: useless2: '2'
|
|
input.y:8.11-13: warning: rule useless in grammar: useless3: '3'
|
|
input.y:9.11-13: warning: rule useless in grammar: useless4: '4'
|
|
input.y:10.11-13: warning: rule useless in grammar: useless5: '5'
|
|
input.y:11.11-13: warning: rule useless in grammar: useless6: '6'
|
|
input.y:12.11-13: warning: rule useless in grammar: useless7: '7'
|
|
input.y:13.11-13: warning: rule useless in grammar: useless8: '8'
|
|
input.y:14.11-13: warning: rule useless in grammar: useless9: '9'
|
|
]])
|
|
|
|
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
|
|
[[Nonterminals useless in grammar
|
|
useless1
|
|
useless2
|
|
useless3
|
|
useless4
|
|
useless5
|
|
useless6
|
|
useless7
|
|
useless8
|
|
useless9
|
|
Terminals unused in grammar
|
|
'1'
|
|
'2'
|
|
'3'
|
|
'4'
|
|
'5'
|
|
'6'
|
|
'7'
|
|
'8'
|
|
'9'
|
|
Rules useless in grammar
|
|
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_BISON_CHECK([[not-reduced.y]], 0, [],
|
|
[[not-reduced.y: warning: 2 nonterminals useless in grammar
|
|
not-reduced.y: warning: 3 rules useless in grammar
|
|
not-reduced.y:14.1-13: warning: nonterminal useless in grammar: not_reachable
|
|
not-reduced.y:11.6-19: warning: nonterminal useless in grammar: non_productive
|
|
not-reduced.y:11.6-57: warning: rule useless in grammar: exp: non_productive
|
|
not-reduced.y:14.16-56: warning: rule useless in grammar: not_reachable: useful
|
|
not-reduced.y:17.17-18.63: warning: rule useless in grammar: non_productive: non_productive useless_token
|
|
]])
|
|
|
|
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
|
|
[[Nonterminals useless in grammar
|
|
not_reachable
|
|
non_productive
|
|
Terminals unused in grammar
|
|
useless_token
|
|
Rules useless in grammar
|
|
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_BISON_CHECK([[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_BISON_CHECK([[input.y]], 0, [],
|
|
[[input.y: warning: 2 nonterminals useless in grammar
|
|
input.y: warning: 3 rules useless in grammar
|
|
input.y:5.15-25: warning: nonterminal useless in grammar: underivable
|
|
input.y:6.14-24: warning: nonterminal useless in grammar: indirection
|
|
input.y:5.15-25: warning: rule useless in grammar: exp: underivable
|
|
input.y:6.14-24: warning: rule useless in grammar: underivable: indirection
|
|
input.y:7.14-24: warning: rule useless in grammar: indirection: underivable
|
|
]])
|
|
|
|
AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
|
|
[[Nonterminals useless in grammar
|
|
underivable
|
|
indirection
|
|
Rules useless in grammar
|
|
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_BISON_CHECK([[input.y]], 1, [],
|
|
[[input.y: warning: 2 nonterminals useless in grammar
|
|
input.y: warning: 2 rules useless in grammar
|
|
input.y:3.1-3: fatal error: start symbol exp does not derive any sentence
|
|
]])
|
|
|
|
AT_CLEANUP
|