Index: bison/src/bison/2.4.1/bison-2.4.1-src/tests/reduce.at |
=================================================================== |
--- bison/src/bison/2.4.1/bison-2.4.1-src/tests/reduce.at (revision 0) |
+++ bison/src/bison/2.4.1/bison-2.4.1-src/tests/reduce.at (revision 0) |
@@ -0,0 +1,357 @@ |
+# Exercising Bison Grammar Reduction. -*- Autotest -*- |
+# Copyright (C) 2001, 2002, 2007, 2008 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_BANNER([[Grammar Reduction.]]) |
+ |
+ |
+## ------------------- ## |
+## Useless Terminals. ## |
+## ------------------- ## |
+ |
+AT_SETUP([Useless Terminals]) |
+ |
+AT_DATA([[input.y]], |
+[[%verbose |
+%output "input.c" |
+ |
+%token useless1 |
+%token useless2 |
+%token useless3 |
+%token useless4 |
+%token useless5 |
+%token useless6 |
+%token useless7 |
+%token useless8 |
+%token useless9 |
+ |
+%token useful |
+%% |
+exp: useful; |
+]]) |
+ |
+AT_BISON_CHECK([[input.y]]) |
+ |
+AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, |
+[[Terminals unused in grammar |
+ useless1 |
+ useless2 |
+ useless3 |
+ useless4 |
+ useless5 |
+ useless6 |
+ useless7 |
+ useless8 |
+ useless9 |
+]]) |
+ |
+AT_CLEANUP |
+ |
+ |
+ |
+## ---------------------- ## |
+## Useless Nonterminals. ## |
+## ---------------------- ## |
+ |
+AT_SETUP([Useless Nonterminals]) |
+ |
+AT_DATA([[input.y]], |
+[[%verbose |
+%output "input.c" |
+ |
+%nterm useless1 |
+%nterm useless2 |
+%nterm useless3 |
+%nterm useless4 |
+%nterm useless5 |
+%nterm useless6 |
+%nterm useless7 |
+%nterm useless8 |
+%nterm useless9 |
+ |
+%token useful |
+%% |
+exp: useful; |
+]]) |
+ |
+AT_BISON_CHECK([[input.y]], 0, [], |
+[[input.y: warning: 9 nonterminals useless in grammar |
+input.y:4.8-15: warning: nonterminal useless in grammar: useless1 |
+input.y:5.8-15: warning: nonterminal useless in grammar: useless2 |
+input.y:6.8-15: warning: nonterminal useless in grammar: useless3 |
+input.y:7.8-15: warning: nonterminal useless in grammar: useless4 |
+input.y:8.8-15: warning: nonterminal useless in grammar: useless5 |
+input.y:9.8-15: warning: nonterminal useless in grammar: useless6 |
+input.y:10.8-15: warning: nonterminal useless in grammar: useless7 |
+input.y:11.8-15: warning: nonterminal useless in grammar: useless8 |
+input.y:12.8-15: warning: nonterminal useless in grammar: useless9 |
+]]) |
+ |
+AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, |
+[[Nonterminals useless in grammar |
+ useless1 |
+ useless2 |
+ useless3 |
+ useless4 |
+ useless5 |
+ useless6 |
+ useless7 |
+ useless8 |
+ useless9 |
+]]) |
+ |
+AT_CLEANUP |
+ |
+ |
+ |
+## --------------- ## |
+## Useless Rules. ## |
+## --------------- ## |
+ |
+AT_SETUP([Useless Rules]) |
+ |
+AT_KEYWORDS([report]) |
+ |
+AT_DATA([[input.y]], |
+[[%verbose |
+%output "input.c" |
+%token useful |
+%% |
+exp: useful; |
+useless1: '1'; |
+useless2: '2'; |
+useless3: '3'; |
+useless4: '4'; |
+useless5: '5'; |
+useless6: '6'; |
+useless7: '7'; |
+useless8: '8'; |
+useless9: '9'; |
+]]) |
+ |
+AT_BISON_CHECK([[input.y]], 0, [], |
+[[input.y: warning: 9 nonterminals useless in grammar |
+input.y: warning: 9 rules useless in grammar |
+input.y:6.1-8: warning: nonterminal useless in grammar: useless1 |
+input.y:7.1-8: warning: nonterminal useless in grammar: useless2 |
+input.y:8.1-8: warning: nonterminal useless in grammar: useless3 |
+input.y:9.1-8: warning: nonterminal useless in grammar: useless4 |
+input.y:10.1-8: warning: nonterminal useless in grammar: useless5 |
+input.y:11.1-8: warning: nonterminal useless in grammar: useless6 |
+input.y:12.1-8: warning: nonterminal useless in grammar: useless7 |
+input.y:13.1-8: warning: nonterminal useless in grammar: useless8 |
+input.y:14.1-8: warning: nonterminal useless in grammar: useless9 |
+input.y:6.11-13: warning: rule useless in grammar: useless1: '1' |
+input.y:7.11-13: warning: rule useless in grammar: useless2: '2' |
+input.y:8.11-13: warning: rule useless in grammar: useless3: '3' |
+input.y:9.11-13: warning: rule useless in grammar: useless4: '4' |
+input.y:10.11-13: warning: rule useless in grammar: useless5: '5' |
+input.y:11.11-13: warning: rule useless in grammar: useless6: '6' |
+input.y:12.11-13: warning: rule useless in grammar: useless7: '7' |
+input.y:13.11-13: warning: rule useless in grammar: useless8: '8' |
+input.y:14.11-13: warning: rule useless in grammar: useless9: '9' |
+]]) |
+ |
+AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, |
+[[Nonterminals useless in grammar |
+ useless1 |
+ useless2 |
+ useless3 |
+ useless4 |
+ useless5 |
+ useless6 |
+ useless7 |
+ useless8 |
+ useless9 |
+Terminals unused in grammar |
+ '1' |
+ '2' |
+ '3' |
+ '4' |
+ '5' |
+ '6' |
+ '7' |
+ '8' |
+ '9' |
+Rules useless in grammar |
+ 2 useless1: '1' |
+ 3 useless2: '2' |
+ 4 useless3: '3' |
+ 5 useless4: '4' |
+ 6 useless5: '5' |
+ 7 useless6: '6' |
+ 8 useless7: '7' |
+ 9 useless8: '8' |
+ 10 useless9: '9' |
+]]) |
+ |
+AT_CLEANUP |
+ |
+ |
+ |
+## ------------------- ## |
+## Reduced Automaton. ## |
+## ------------------- ## |
+ |
+# Check that the automaton is that as the for the grammar reduced by |
+# hand. |
+ |
+AT_SETUP([Reduced Automaton]) |
+ |
+AT_KEYWORDS([report]) |
+ |
+# 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_BISON_CHECK([[not-reduced.y]], 0, [], |
+[[not-reduced.y: warning: 2 nonterminals useless in grammar |
+not-reduced.y: warning: 3 rules useless in grammar |
+not-reduced.y:14.1-13: warning: nonterminal useless in grammar: not_reachable |
+not-reduced.y:11.6-19: warning: nonterminal useless in grammar: non_productive |
+not-reduced.y:11.6-57: warning: rule useless in grammar: exp: non_productive |
+not-reduced.y:14.16-56: warning: rule useless in grammar: not_reachable: useful |
+not-reduced.y:17.17-18.63: warning: rule useless in grammar: non_productive: non_productive useless_token |
+]]) |
+ |
+AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0, |
+[[Nonterminals useless in grammar |
+ not_reachable |
+ non_productive |
+Terminals unused in grammar |
+ useless_token |
+Rules useless in grammar |
+ 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_BISON_CHECK([[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. ## |
+## ------------------- ## |
+ |
+AT_SETUP([Underivable Rules]) |
+ |
+AT_KEYWORDS([report]) |
+ |
+AT_DATA([[input.y]], |
+[[%verbose |
+%output "input.c" |
+%token useful |
+%% |
+exp: useful | underivable; |
+underivable: indirection; |
+indirection: underivable; |
+]]) |
+ |
+AT_BISON_CHECK([[input.y]], 0, [], |
+[[input.y: warning: 2 nonterminals useless in grammar |
+input.y: warning: 3 rules useless in grammar |
+input.y:5.15-25: warning: nonterminal useless in grammar: underivable |
+input.y:6.14-24: warning: nonterminal useless in grammar: indirection |
+input.y:5.15-25: warning: rule useless in grammar: exp: underivable |
+input.y:6.14-24: warning: rule useless in grammar: underivable: indirection |
+input.y:7.14-24: warning: rule useless in grammar: indirection: underivable |
+]]) |
+ |
+AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, |
+[[Nonterminals useless in grammar |
+ underivable |
+ indirection |
+Rules useless in grammar |
+ 2 exp: underivable |
+ 3 underivable: indirection |
+ 4 indirection: underivable |
+]]) |
+ |
+AT_CLEANUP |
+ |
+ |
+ |
+## ---------------- ## |
+## Empty Language. ## |
+## ---------------- ## |
+ |
+AT_SETUP([Empty Language]) |
+ |
+AT_DATA([[input.y]], |
+[[%output "input.c" |
+%% |
+exp: exp; |
+]]) |
+ |
+AT_BISON_CHECK([[input.y]], 1, [], |
+[[input.y: warning: 2 nonterminals useless in grammar |
+input.y: warning: 2 rules useless in grammar |
+input.y:3.1-3: fatal error: start symbol exp does not derive any sentence |
+]]) |
+ |
+AT_CLEANUP |