]> git.saurik.com Git - bison.git/blobdiff - tests/reduce.at
Grammar declarations may be found in the grammar section.
[bison.git] / tests / reduce.at
index f38758228315853d5edb7249e7ea80635655c8ac..24911943aaa6c5f882e2ae8bccff195283cd92b5 100644 (file)
@@ -44,12 +44,10 @@ AT_DATA([[input.y]],
 exp: useful;
 ]])
 
-AT_CHECK([[bison input.y]], 0, [],
-[[input.y contains 9 useless nonterminals
-]])
+AT_CHECK([[bison input.y]])
 
 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
-[[Useless nonterminals:
+[[Terminals which are not used:
    useless1
    useless2
    useless3
@@ -175,6 +173,91 @@ AT_CLEANUP
 
 
 
+## ------------------- ##
+## Reduced Automaton.  ##
+## ------------------- ##
+
+# Check that the automaton is that as the for the grammar reduced by
+# hand.
+
+AT_SETUP([Reduced Automaton])
+
+# 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_CHECK([[bison not-reduced.y]], 0, [],
+[[not-reduced.y contains 2 useless nonterminals and 3 useless rules
+]])
+
+AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
+[[Useless nonterminals:
+   not_reachable
+   non_productive
+Terminals which are not used:
+   useless_token
+Useless rules:
+#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_CHECK([[bison 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.  ##
 ## ------------------- ##