X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/68f1e3edc304e03b249b64791e4b7d981938bef4..b7195100fd19a03481298c4c27242f8125c1c2a0:/tests/reduce.at diff --git a/tests/reduce.at b/tests/reduce.at index f3875822..e475cb04 100644 --- a/tests/reduce.at +++ b/tests/reduce.at @@ -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 @@ -91,11 +89,20 @@ exp: useful; ]]) AT_CHECK([[bison input.y]], 0, [], -[[input.y contains 9 useless nonterminals +[[input.y: warning: 9 useless nonterminals +input.y:4.8-15: warning: useless nonterminal: useless1 +input.y:5.8-15: warning: useless nonterminal: useless2 +input.y:6.8-15: warning: useless nonterminal: useless3 +input.y:7.8-15: warning: useless nonterminal: useless4 +input.y:8.8-15: warning: useless nonterminal: useless5 +input.y:9.8-15: warning: useless nonterminal: useless6 +input.y:10.8-15: warning: useless nonterminal: useless7 +input.y:11.8-15: warning: useless nonterminal: useless8 +input.y:12.8-15: warning: useless nonterminal: useless9 ]]) AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, -[[Useless nonterminals: +[[Useless nonterminals useless1 useless2 useless3 @@ -117,6 +124,8 @@ AT_CLEANUP AT_SETUP([Useless Rules]) +AT_KEYWORDS([report]) + AT_DATA([[input.y]], [[%verbose %output="input.c" @@ -135,11 +144,29 @@ useless9: '9'; ]]) AT_CHECK([[bison input.y]], 0, [], -[[input.y contains 9 useless nonterminals and 9 useless rules +[[input.y: warning: 9 useless nonterminals and 9 useless rules +input.y:6.1-8: warning: useless nonterminal: useless1 +input.y:7.1-8: warning: useless nonterminal: useless2 +input.y:8.1-8: warning: useless nonterminal: useless3 +input.y:9.1-8: warning: useless nonterminal: useless4 +input.y:10.1-8: warning: useless nonterminal: useless5 +input.y:11.1-8: warning: useless nonterminal: useless6 +input.y:12.1-8: warning: useless nonterminal: useless7 +input.y:13.1-8: warning: useless nonterminal: useless8 +input.y:14.1-8: warning: useless nonterminal: useless9 +input.y:6.9-13: warning: useless rule: useless1: '1' +input.y:7.9-13: warning: useless rule: useless2: '2' +input.y:8.9-13: warning: useless rule: useless3: '3' +input.y:9.9-13: warning: useless rule: useless4: '4' +input.y:10.9-13: warning: useless rule: useless5: '5' +input.y:11.9-13: warning: useless rule: useless6: '6' +input.y:12.9-13: warning: useless rule: useless7: '7' +input.y:13.9-13: warning: useless rule: useless8: '8' +input.y:14.9-13: warning: useless rule: useless9: '9' ]]) AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, -[[Useless nonterminals: +[[Useless nonterminals useless1 useless2 useless3 @@ -149,7 +176,7 @@ AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, useless7 useless8 useless9 -Terminals which are not used: +Terminals which are not used '1' '2' '3' @@ -159,18 +186,110 @@ Terminals which are not used: '7' '8' '9' -Useless rules: -#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'; +Useless rules + 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 useless nonterminals and 3 useless rules +not-reduced.y:14.1-13: warning: useless nonterminal: not_reachable +not-reduced.y:11.6-19: warning: useless nonterminal: non_productive +not-reduced.y:11.4-57: warning: useless rule: exp: non_productive +not-reduced.y:14.14-56: warning: useless rule: not_reachable: useful +not-reduced.y:17.15-18.63: warning: useless rule: non_productive: non_productive useless_token +]]) + +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 @@ -181,6 +300,8 @@ AT_CLEANUP AT_SETUP([Underivable Rules]) +AT_KEYWORDS([report]) + AT_DATA([[input.y]], [[%verbose %output="input.c" @@ -192,17 +313,43 @@ indirection: underivable; ]]) AT_CHECK([[bison input.y]], 0, [], -[[input.y contains 2 useless nonterminals and 3 useless rules +[[input.y: warning: 2 useless nonterminals and 3 useless rules +input.y:5.15-25: warning: useless nonterminal: underivable +input.y:6.14-24: warning: useless nonterminal: indirection +input.y:5.13-25: warning: useless rule: exp: underivable +input.y:6.12-24: warning: useless rule: underivable: indirection +input.y:7.12-24: warning: useless rule: indirection: underivable ]]) AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, -[[Useless nonterminals: +[[Useless nonterminals underivable indirection -Useless rules: -#2 exp: underivable; -#3 underivable: indirection; -#4 indirection: underivable; +Useless rules + 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 useless nonterminals and 2 useless rules +input.y:3.1-3: fatal error: start symbol exp does not derive any sentence ]]) AT_CLEANUP