X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/ed8e1f68e9743c391f4aba148968ea1e5e960973..34cdeddfa54df8c85b20bf013a0b82053a5148f2:/tests/sets.at

diff --git a/tests/sets.at b/tests/sets.at
index 7fa8d1f7..d17c9931 100644
--- a/tests/sets.at
+++ b/tests/sets.at
@@ -1,20 +1,58 @@
 # Exercising Bison Grammar Sets.                      -*- Autotest -*-
-# Copyright 2001 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
+# 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.
-
+# 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)
+# ------------------------------
+# 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.).]])
 
@@ -38,81 +76,32 @@ AT_DATA([[input.y]],
 e: 'e' | /* Nothing */;
 ]])
 
-AT_CHECK([[bison --trace input.y]], [], [],
-[[RITEM
-  'e'  (rule 1)
-  (rule 2)
-
-
-DERIVES
+AT_CHECK([[bison --trace=sets input.y]], [], [], [stderr])
+AT_EXTRACT_SETS([stderr], [sets])
+AT_CHECK([[cat sets]], [],
+[[DERIVES
+	$accept derives
+		  0  e $end
 	e derives
-		1: 'e' (rule 1)
-		2: (rule 2)
-
-
-Entering set_nullable
+		  1  'e'
+		  2  /* empty */
 NULLABLE
+	$accept: no
 	e: yes
-
-
-TC: Input BEGIN
-    @&t@
-   0
-  .-.
- 0| |
-  `-'
-TC: Input END
-
-TC: Output BEGIN
-    @&t@
-   0
-  .-.
- 0| |
-  `-'
-TC: Output END
-
 FIRSTS
+	$accept firsts
+		$accept
+		e
 	e firsts
-		4 (e)
-
-
+		e
 FDERIVES
+	$accept derives
+		  0  e $end
+		  1  'e'
+		  2  /* empty */
 	e derives
-		1: 'e'
-		2:
-
-
-Processing state 0 (reached by $)
-Closure: input
-
-
-Closure: output
-   0: . 'e'  (rule 1)
-   2: .  (rule 2)
-
-
-Entering new_itemsets, state = 0
-Entering append_states, state = 0
-Entering get_state, state = 0, symbol = 3 ('e')
-Entering new_state, state = 0, symbol = 3 ('e')
-Exiting get_state => 1
-Processing state 1 (reached by 'e')
-Closure: input
-   1: .  (rule 1)
-
-
-Closure: output
-   1: .  (rule 1)
-
-
-Entering new_itemsets, state = 1
-Entering append_states, state = 1
-transpose: input
-  0: @&t@
-
-transpose: output
-  0: @&t@
-
+		  1  'e'
+		  2  /* empty */
 ]])
 
 AT_CLEANUP
@@ -161,33 +150,151 @@ AT_SETUP([Broken Closure])
 
 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=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_CHECK([bison --trace input.y 2>&1 |
-          sed -n '/^TC: Output BEGIN/,/^TC: Output END/p'],
-         [0],
-[[TC: Output BEGIN
-           @&t@
-   01234567
-  .--------.
- 0| 1111111|
- 1|  111111|
- 2|   11111|
- 3|    1111|
- 4|     111|
- 5|      11|
- 6|       1|
- 7|        |
-  `--------'
-TC: 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_CHECK([[bison --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_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