# Exercising Bison Grammar Sets. -*- Autotest -*-
-# Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2005 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
# 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
# AT_EXTRACT_SETS(INPUT, OUTPUT)
:null
p
n
- /^[ ]*$/ !b null
+ /^[ ]*$/ !b null
}
/^FIRSTS$/ {
:firsts
p
n
- /^[ ]*$/ !b firsts
+ /^[ ]*$/ !b firsts
}
/^FDERIVES$/ {
:fderiv
p
n
- /^[ ]*$/ !b fderiv
+ /^[ ]*$/ !b fderiv
}
/^DERIVES$/ {
:deriv
p
n
- /^[ ]*$/ !b deriv
+ /^[ ]*$/ !b deriv
}
]])
AT_CHECK([sed -f extract.sed $1], 0, [stdout])
e: 'e' | /* Nothing */;
]])
-AT_CHECK([[bison --trace input.y]], [], [], [stderr])
+AT_CHECK([[bison --trace=sets input.y]], [], [], [stderr])
AT_EXTRACT_SETS([stderr], [sets])
AT_CHECK([[cat sets]], [],
[[DERIVES
- $axiom derives
- 0 e $
+ $accept derives
+ 0 e $end
e derives
1 'e'
2 /* empty */
NULLABLE
- $axiom: no
+ $accept: no
e: yes
FIRSTS
- $axiom firsts
- $axiom
+ $accept firsts
+ $accept
e
e firsts
e
FDERIVES
- $axiom derives
- 1 e $
- 2 'e'
- 3 /* empty */
+ $accept derives
+ 0 e $end
+ 1 'e'
+ 2 /* empty */
e derives
- 2 'e'
- 3 /* empty */
+ 1 'e'
+ 2 /* empty */
]])
AT_CLEANUP
h: 'h';
]])
-AT_CHECK([[bison --trace input.y]], [], [], [stderr])
+AT_CHECK([[bison --trace=sets input.y]], [], [], [stderr])
AT_CHECK([[sed -n 's/[ ]*$//;/^RTC: Firsts Output BEGIN/,/^RTC: Firsts Output END/p' stderr]], [],
[[RTC: Firsts Output BEGIN
;
]])
-AT_CHECK([[bison --trace input.y]], [], [], [stderr])
+AT_CHECK([[bison --trace=sets input.y]], [], [], [stderr])
AT_EXTRACT_SETS([stderr], [sets])
AT_CHECK([[cat sets]], [],
[[DERIVES
- $axiom derives
- 0 exp $
+ $accept derives
+ 0 exp $end
exp derives
1 exp '<' exp
2 exp '>' exp
6 exp '=' exp
7 "exp"
NULLABLE
- $axiom: no
+ $accept: no
exp: no
FIRSTS
- $axiom firsts
- $axiom
+ $accept firsts
+ $accept
exp
exp firsts
exp
FDERIVES
- $axiom derives
- 1 exp $
- 2 exp '<' exp
- 3 exp '>' exp
- 4 exp '+' exp
- 5 exp '-' exp
- 6 exp '^' exp
- 7 exp '=' exp
- 8 "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
- 2 exp '<' exp
- 3 exp '>' exp
- 4 exp '+' exp
- 5 exp '-' exp
- 6 exp '^' exp
- 7 exp '=' exp
- 8 "exp"
+ 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_CHECK([[bison -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