# Exercising Bison Grammar Sets. -*- Autotest -*-
-# 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
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
+# Copyright (C) 2001-2002, 2005, 2007, 2009-2012 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
# AT_EXTRACT_SETS(INPUT, OUTPUT)
# ------------------------------
[AT_DATA([extract.sed],
[[#n
/^NULLABLE$/ {
- :nullable
+ :null
p
n
- /^[ ]*$/! b nullable
+ /^ *$/ !b null
}
/^FIRSTS$/ {
:firsts
p
n
- /^[ ]*$/! b firsts
+ /^ *$/ !b firsts
}
/^FDERIVES$/ {
- :fderives
+ :fderiv
p
n
- /^[ ]*$/! b fderives
+ /^ *$/ !b fderiv
}
/^DERIVES$/ {
- :derives
+ :deriv
p
n
- /^[ ]*$/! b derives
+ /^ *$/ !b deriv
}
]])
AT_CHECK([sed -f extract.sed $1], 0, [stdout])
e: 'e' | /* Nothing */;
]])
-AT_CHECK([[bison --trace input.y]], [], [], [stderr])
+AT_BISON_CHECK([[--trace=sets input.y]], [], [], [stderr])
AT_EXTRACT_SETS([stderr], [sets])
AT_CHECK([[cat sets]], [],
[[DERIVES
- $axiom derives
- 1: e $ (rule 0)
- e derives
- 2: 'e' (rule 1)
- 3: (rule 2)
+ $accept derives
+ 0 e $end
+ e derives
+ 1 'e'
+ 2 /* empty */
NULLABLE
- $axiom: no
- e: yes
+ $accept: no
+ e: yes
FIRSTS
- $axiom firsts
- 4 ($axiom)
- 5 (e)
- e firsts
- 5 (e)
+ $accept firsts
+ $accept
+ e
+ e firsts
+ e
FDERIVES
- $axiom derives
- 0: e $
- 1: 'e'
- 2:
- e derives
- 1: 'e'
- 2:
+ $accept derives
+ 0 e $end
+ 1 'e'
+ 2 /* empty */
+ e derives
+ 1 'e'
+ 2 /* empty */
]])
AT_CLEANUP
AT_DATA([input.y],
[[%%
-a: b
-b: c
-c: d
-d: e
-e: f
-f: g
-g: h
-h: 'h'
+a: b;
+b: c;
+c: d;
+d: e;
+e: f;
+f: g;
+g: h;
+h: 'h';
]])
-AT_CHECK([[bison --trace input.y]], [], [], [stderr])
+AT_BISON_CHECK([[--trace=sets input.y]], [], [], [stderr])
-AT_CHECK([[sed -n 's/[ ]*$//;/^TC: Output BEGIN/,/^TC: Output END/p' stderr]], [],
-[[TC: Output BEGIN
+AT_CHECK([[sed -n 's/[ ]*$//;/^RTC: Firsts Output BEGIN/,/^RTC: Firsts Output END/p' stderr]], [],
+[[RTC: Firsts Output BEGIN
012345678
.---------.
- 0| 11111111|
- 1| 1111111|
- 2| 111111|
- 3| 11111|
- 4| 1111|
- 5| 111|
- 6| 11|
- 7| 1|
- 8| |
+ 0|111111111|
+ 1| 11111111|
+ 2| 1111111|
+ 3| 111111|
+ 4| 11111|
+ 5| 1111|
+ 6| 111|
+ 7| 11|
+ 8| 1|
`---------'
-TC: Output END
+RTC: Firsts Output END
]])
AT_CLEANUP
;
]])
-AT_CHECK([[bison --trace input.y]], [], [], [stderr])
+AT_BISON_CHECK([[--trace=sets input.y]], [], [], [stderr])
AT_EXTRACT_SETS([stderr], [sets])
AT_CHECK([[cat sets]], [],
[[DERIVES
- $axiom derives
- 1: exp $ (rule 0)
- exp derives
- 2: exp '<' exp (rule 1)
- 3: exp '>' exp (rule 2)
- 4: exp '+' exp (rule 3)
- 5: exp '-' exp (rule 4)
- 6: exp '^' exp (rule 5)
- 7: exp '=' exp (rule 6)
- 8: "exp" (rule 7)
+ $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
- $axiom: no
- exp: no
+ $accept: no
+ exp: no
FIRSTS
- $axiom firsts
- 10 ($axiom)
- 11 (exp)
- exp firsts
- 11 (exp)
+ $accept firsts
+ $accept
+ exp
+ exp firsts
+ exp
FDERIVES
- $axiom derives
- 0: exp $
- 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"
+ $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