mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +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/local.mk, data/location.cc: * data/stack.hh, data/variant.hh, 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/local.mk, djgpp/subpipe.c, djgpp/subpipe.h: * djgpp/testsuite.sed, doc/bison.texinfo, doc/local.mk: * doc/refcard.tex, etc/README, etc/bench.pl.in, etc/local.mk: * examples/calc++/Makefile.am, examples/extexi: * examples/local.mk, 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/local.mk, 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/AnnotationList.c, src/AnnotationList.h: * src/InadequacyList.c, src/InadequacyList.h, src/LR0.c: * src/LR0.h, src/Sbitset.c, src/Sbitset.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/ielr.c: * src/ielr.h, src/lalr.c, src/lalr.h, src/local.mk: * src/location.c, src/location.h, src/main.c: * src/muscle-tab.c, src/muscle-tab.h, src/named-ref.c: * src/named-ref.h, 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/local.mk, tests/named-refs.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: 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.
303 lines
5.1 KiB
Plaintext
303 lines
5.1 KiB
Plaintext
# Exercising Bison Grammar Sets. -*- Autotest -*-
|
|
|
|
# Copyright (C) 2001, 2002, 2005, 2007, 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_EXTRACT_SETS(INPUT, OUTPUT)
|
|
# ------------------------------
|
|
# Extract the information about the grammar sets from a bison
|
|
# trace output (INPUT), and save it in OUTPUT.
|
|
# And remember, there is no alternation in portable sed.
|
|
m4_define([AT_EXTRACT_SETS],
|
|
[AT_DATA([extract.sed],
|
|
[[#n
|
|
/^NULLABLE$/ {
|
|
:null
|
|
p
|
|
n
|
|
/^[ ]*$/ !b null
|
|
}
|
|
/^FIRSTS$/ {
|
|
:firsts
|
|
p
|
|
n
|
|
/^[ ]*$/ !b firsts
|
|
}
|
|
/^FDERIVES$/ {
|
|
:fderiv
|
|
p
|
|
n
|
|
/^[ ]*$/ !b fderiv
|
|
}
|
|
/^DERIVES$/ {
|
|
:deriv
|
|
p
|
|
n
|
|
/^[ ]*$/ !b deriv
|
|
}
|
|
]])
|
|
AT_CHECK([sed -f extract.sed $1], 0, [stdout])
|
|
AT_CHECK([mv stdout $2])
|
|
])
|
|
|
|
|
|
|
|
AT_BANNER([[Grammar Sets (Firsts etc.).]])
|
|
|
|
|
|
## ---------- ##
|
|
## Nullable. ##
|
|
## ---------- ##
|
|
|
|
AT_SETUP([Nullable])
|
|
|
|
# At some point, nullable had been smoking grass, and managed to say:
|
|
#
|
|
# Entering set_nullable
|
|
# NULLABLE
|
|
# 'e': yes
|
|
# (null): no
|
|
# ...
|
|
|
|
AT_DATA([[input.y]],
|
|
[[%%
|
|
e: 'e' | /* Nothing */;
|
|
]])
|
|
|
|
AT_BISON_CHECK([[--trace=sets input.y]], [], [], [stderr])
|
|
AT_EXTRACT_SETS([stderr], [sets])
|
|
AT_CHECK([[cat sets]], [],
|
|
[[DERIVES
|
|
$accept derives
|
|
0 e $end
|
|
e derives
|
|
1 'e'
|
|
2 /* empty */
|
|
NULLABLE
|
|
$accept: no
|
|
e: yes
|
|
FIRSTS
|
|
$accept firsts
|
|
$accept
|
|
e
|
|
e firsts
|
|
e
|
|
FDERIVES
|
|
$accept derives
|
|
0 e $end
|
|
1 'e'
|
|
2 /* empty */
|
|
e derives
|
|
1 'e'
|
|
2 /* empty */
|
|
]])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
## ---------------- ##
|
|
## Broken Closure. ##
|
|
## ---------------- ##
|
|
|
|
# TC was once broken during a massive `simplification' of the code.
|
|
# It resulted in bison dumping core on the following grammar (the
|
|
# computation of FIRSTS uses TC). It managed to produce a pretty
|
|
# exotic closure:
|
|
#
|
|
# TC: Input
|
|
#
|
|
# 01234567
|
|
# +--------+
|
|
# 0| 1 |
|
|
# 1| 1 |
|
|
# 2| 1 |
|
|
# 3| 1 |
|
|
# 4| 1 |
|
|
# 5| 1 |
|
|
# 6| 1|
|
|
# 7| |
|
|
# +--------+
|
|
#
|
|
# TC: Output
|
|
#
|
|
# 01234567
|
|
# +--------+
|
|
# 0| 1 |
|
|
# 1| 111 |
|
|
# 2| 111 |
|
|
# 3| 1111 |
|
|
# 4| 111 1 |
|
|
# 5| 111 1 |
|
|
# 6| 111 1|
|
|
# 7| 111 |
|
|
# +--------+
|
|
#
|
|
# instead of that below.
|
|
|
|
AT_SETUP([Broken Closure])
|
|
|
|
AT_DATA([input.y],
|
|
[[%%
|
|
a: b;
|
|
b: c;
|
|
c: d;
|
|
d: e;
|
|
e: f;
|
|
f: g;
|
|
g: h;
|
|
h: 'h';
|
|
]])
|
|
|
|
AT_BISON_CHECK([[--trace=sets input.y]], [], [], [stderr])
|
|
|
|
AT_CHECK([[sed -n 's/[ ]*$//;/^RTC: Firsts Output BEGIN/,/^RTC: Firsts Output END/p' stderr]], [],
|
|
[[RTC: Firsts Output BEGIN
|
|
|
|
012345678
|
|
.---------.
|
|
0|111111111|
|
|
1| 11111111|
|
|
2| 1111111|
|
|
3| 111111|
|
|
4| 11111|
|
|
5| 1111|
|
|
6| 111|
|
|
7| 11|
|
|
8| 1|
|
|
`---------'
|
|
RTC: Firsts Output END
|
|
]])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
|
|
## -------- ##
|
|
## Firsts. ##
|
|
## -------- ##
|
|
|
|
AT_SETUP([Firsts])
|
|
|
|
AT_DATA([input.y],
|
|
[[%nonassoc '<' '>'
|
|
%left '+' '-'
|
|
%right '^' '='
|
|
%%
|
|
exp:
|
|
exp '<' exp
|
|
| exp '>' exp
|
|
| exp '+' exp
|
|
| exp '-' exp
|
|
| exp '^' exp
|
|
| exp '=' exp
|
|
| "exp"
|
|
;
|
|
]])
|
|
|
|
AT_BISON_CHECK([[--trace=sets input.y]], [], [], [stderr])
|
|
AT_EXTRACT_SETS([stderr], [sets])
|
|
AT_CHECK([[cat sets]], [],
|
|
[[DERIVES
|
|
$accept derives
|
|
0 exp $end
|
|
exp derives
|
|
1 exp '<' exp
|
|
2 exp '>' exp
|
|
3 exp '+' exp
|
|
4 exp '-' exp
|
|
5 exp '^' exp
|
|
6 exp '=' exp
|
|
7 "exp"
|
|
NULLABLE
|
|
$accept: no
|
|
exp: no
|
|
FIRSTS
|
|
$accept firsts
|
|
$accept
|
|
exp
|
|
exp firsts
|
|
exp
|
|
FDERIVES
|
|
$accept derives
|
|
0 exp $end
|
|
1 exp '<' exp
|
|
2 exp '>' exp
|
|
3 exp '+' exp
|
|
4 exp '-' exp
|
|
5 exp '^' exp
|
|
6 exp '=' exp
|
|
7 "exp"
|
|
exp derives
|
|
1 exp '<' exp
|
|
2 exp '>' exp
|
|
3 exp '+' exp
|
|
4 exp '-' exp
|
|
5 exp '^' exp
|
|
6 exp '=' exp
|
|
7 "exp"
|
|
]])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
|
|
|
|
## -------- ##
|
|
## Accept. ##
|
|
## -------- ##
|
|
|
|
# In some weird cases Bison could compute an incorrect final state
|
|
# number. This happens only if the $end token is used in the user
|
|
# grammar, which is a very suspicious accidental feature introduced as
|
|
# a side effect of allowing the user to name $end using `%token END 0
|
|
# "end of file"'.
|
|
|
|
AT_SETUP([Accept])
|
|
|
|
AT_DATA([input.y],
|
|
[[%token END 0
|
|
%%
|
|
input:
|
|
'a'
|
|
| '(' input ')'
|
|
| '(' error END
|
|
;
|
|
]])
|
|
|
|
AT_BISON_CHECK([[-v -o input.c input.y]])
|
|
|
|
# Get the final state in the parser.
|
|
AT_CHECK([[sed -n 's/.*define YYFINAL *\([0-9][0-9]*\)/final state \1/p' input.c]],
|
|
0, [stdout])
|
|
mv stdout expout
|
|
|
|
# Get the final state in the report, from the "accept" action..
|
|
AT_CHECK([sed -n '
|
|
/^state \(.*\)/{
|
|
s//final state \1/
|
|
x
|
|
}
|
|
/ accept/{
|
|
x
|
|
p
|
|
q
|
|
}
|
|
' input.output],
|
|
0, [expout])
|
|
|
|
AT_CLEANUP
|