X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/d2d1b42b0730316f4f70eb416dcc767ffaaa2019..d80fb37a26b24d8aa7a4428389a6004c7f2e93be:/tests/reduce.at diff --git a/tests/reduce.at b/tests/reduce.at index 73856df9..9e5246af 100644 --- a/tests/reduce.at +++ b/tests/reduce.at @@ -1,20 +1,18 @@ # Exercising Bison Grammar Reduction. -*- Autotest -*- -# Copyright 2001 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2007 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 . AT_BANNER([[Grammar Reduction.]]) @@ -27,7 +25,7 @@ AT_SETUP([Useless Terminals]) AT_DATA([[input.y]], [[%verbose -%output="input.c" +%output "input.c" %token useless1 %token useless2 @@ -44,12 +42,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 unused in grammar useless1 useless2 useless3 @@ -73,7 +69,7 @@ AT_SETUP([Useless Nonterminals]) AT_DATA([[input.y]], [[%verbose -%output="input.c" +%output "input.c" %nterm useless1 %nterm useless2 @@ -91,11 +87,84 @@ exp: useful; ]]) AT_CHECK([[bison input.y]], 0, [], -[[input.y contains 9 useless nonterminals +[[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_CHECK([[bison input.y]], 0, [], +[[input.y: warning: 9 nonterminals and 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, -[[Useless nonterminals: +[[Nonterminals useless in grammar useless1 useless2 useless3 @@ -105,6 +174,180 @@ AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, 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_CHECK([[bison not-reduced.y]], 0, [], +[[not-reduced.y: warning: 2 nonterminals and 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_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. ## +## ------------------- ## + +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_CHECK([[bison input.y]], 0, [], +[[input.y: warning: 2 nonterminals and 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_CHECK([[bison input.y]], 1, [], +[[input.y: warning: 2 nonterminals and 2 rules useless in grammar +input.y:3.1-3: fatal error: start symbol exp does not derive any sentence ]]) AT_CLEANUP