Home | History | Annotate | Download | only in tests
      1 # Exercising Bison Grammar Reduction.                      -*- Autotest -*-
      2 # Copyright (C) 2001, 2002 Free Software Foundation, Inc.
      3 
      4 # This program is free software; you can redistribute it and/or modify
      5 # it under the terms of the GNU General Public License as published by
      6 # the Free Software Foundation; either version 2, or (at your option)
      7 # any later version.
      8 
      9 # This program is distributed in the hope that it will be useful,
     10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 # GNU General Public License for more details.
     13 
     14 # You should have received a copy of the GNU General Public License
     15 # along with this program; if not, write to the Free Software
     16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     17 # 02110-1301, USA.
     18 
     19 AT_BANNER([[Grammar Reduction.]])
     20 
     21 
     22 ## ------------------- ##
     23 ## Useless Terminals.  ##
     24 ## ------------------- ##
     25 
     26 AT_SETUP([Useless Terminals])
     27 
     28 AT_DATA([[input.y]],
     29 [[%verbose
     30 %output="input.c"
     31 
     32 %token useless1
     33 %token useless2
     34 %token useless3
     35 %token useless4
     36 %token useless5
     37 %token useless6
     38 %token useless7
     39 %token useless8
     40 %token useless9
     41 
     42 %token useful
     43 %%
     44 exp: useful;
     45 ]])
     46 
     47 AT_CHECK([[bison input.y]])
     48 
     49 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
     50 [[Terminals which are not used
     51    useless1
     52    useless2
     53    useless3
     54    useless4
     55    useless5
     56    useless6
     57    useless7
     58    useless8
     59    useless9
     60 ]])
     61 
     62 AT_CLEANUP
     63 
     64 
     65 
     66 ## ---------------------- ##
     67 ## Useless Nonterminals.  ##
     68 ## ---------------------- ##
     69 
     70 AT_SETUP([Useless Nonterminals])
     71 
     72 AT_DATA([[input.y]],
     73 [[%verbose
     74 %output="input.c"
     75 
     76 %nterm useless1
     77 %nterm useless2
     78 %nterm useless3
     79 %nterm useless4
     80 %nterm useless5
     81 %nterm useless6
     82 %nterm useless7
     83 %nterm useless8
     84 %nterm useless9
     85 
     86 %token useful
     87 %%
     88 exp: useful;
     89 ]])
     90 
     91 AT_CHECK([[bison input.y]], 0, [],
     92 [[input.y: warning: 9 useless nonterminals
     93 input.y:4.8-15: warning: useless nonterminal: useless1
     94 input.y:5.8-15: warning: useless nonterminal: useless2
     95 input.y:6.8-15: warning: useless nonterminal: useless3
     96 input.y:7.8-15: warning: useless nonterminal: useless4
     97 input.y:8.8-15: warning: useless nonterminal: useless5
     98 input.y:9.8-15: warning: useless nonterminal: useless6
     99 input.y:10.8-15: warning: useless nonterminal: useless7
    100 input.y:11.8-15: warning: useless nonterminal: useless8
    101 input.y:12.8-15: warning: useless nonterminal: useless9
    102 ]])
    103 
    104 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
    105 [[Useless nonterminals
    106    useless1
    107    useless2
    108    useless3
    109    useless4
    110    useless5
    111    useless6
    112    useless7
    113    useless8
    114    useless9
    115 ]])
    116 
    117 AT_CLEANUP
    118 
    119 
    120 
    121 ## --------------- ##
    122 ## Useless Rules.  ##
    123 ## --------------- ##
    124 
    125 AT_SETUP([Useless Rules])
    126 
    127 AT_KEYWORDS([report])
    128 
    129 AT_DATA([[input.y]],
    130 [[%verbose
    131 %output="input.c"
    132 %token useful
    133 %%
    134 exp: useful;
    135 useless1: '1';
    136 useless2: '2';
    137 useless3: '3';
    138 useless4: '4';
    139 useless5: '5';
    140 useless6: '6';
    141 useless7: '7';
    142 useless8: '8';
    143 useless9: '9';
    144 ]])
    145 
    146 AT_CHECK([[bison input.y]], 0, [],
    147 [[input.y: warning: 9 useless nonterminals and 9 useless rules
    148 input.y:6.1-8: warning: useless nonterminal: useless1
    149 input.y:7.1-8: warning: useless nonterminal: useless2
    150 input.y:8.1-8: warning: useless nonterminal: useless3
    151 input.y:9.1-8: warning: useless nonterminal: useless4
    152 input.y:10.1-8: warning: useless nonterminal: useless5
    153 input.y:11.1-8: warning: useless nonterminal: useless6
    154 input.y:12.1-8: warning: useless nonterminal: useless7
    155 input.y:13.1-8: warning: useless nonterminal: useless8
    156 input.y:14.1-8: warning: useless nonterminal: useless9
    157 input.y:6.11-13: warning: useless rule: useless1: '1'
    158 input.y:7.11-13: warning: useless rule: useless2: '2'
    159 input.y:8.11-13: warning: useless rule: useless3: '3'
    160 input.y:9.11-13: warning: useless rule: useless4: '4'
    161 input.y:10.11-13: warning: useless rule: useless5: '5'
    162 input.y:11.11-13: warning: useless rule: useless6: '6'
    163 input.y:12.11-13: warning: useless rule: useless7: '7'
    164 input.y:13.11-13: warning: useless rule: useless8: '8'
    165 input.y:14.11-13: warning: useless rule: useless9: '9'
    166 ]])
    167 
    168 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
    169 [[Useless nonterminals
    170    useless1
    171    useless2
    172    useless3
    173    useless4
    174    useless5
    175    useless6
    176    useless7
    177    useless8
    178    useless9
    179 Terminals which are not used
    180    '1'
    181    '2'
    182    '3'
    183    '4'
    184    '5'
    185    '6'
    186    '7'
    187    '8'
    188    '9'
    189 Useless rules
    190     2 useless1: '1'
    191     3 useless2: '2'
    192     4 useless3: '3'
    193     5 useless4: '4'
    194     6 useless5: '5'
    195     7 useless6: '6'
    196     8 useless7: '7'
    197     9 useless8: '8'
    198    10 useless9: '9'
    199 ]])
    200 
    201 AT_CLEANUP
    202 
    203 
    204 
    205 ## ------------------- ##
    206 ## Reduced Automaton.  ##
    207 ## ------------------- ##
    208 
    209 # Check that the automaton is that as the for the grammar reduced by
    210 # hand.
    211 
    212 AT_SETUP([Reduced Automaton])
    213 
    214 AT_KEYWORDS([report])
    215 
    216 # The non reduced grammar.
    217 # ------------------------
    218 AT_DATA([[not-reduced.y]],
    219 [[/* A useless token. */
    220 %token useless_token
    221 /* A useful one. */
    222 %token useful
    223 %verbose
    224 %output="not-reduced.c"
    225 
    226 %%
    227 
    228 exp: useful            { /* A useful action. */ }
    229    | non_productive    { /* A non productive action. */ }
    230    ;
    231 
    232 not_reachable: useful  { /* A not reachable action. */ }
    233              ;
    234 
    235 non_productive: non_productive useless_token
    236                        { /* Another non productive action. */ }
    237               ;
    238 %%
    239 ]])
    240 
    241 AT_CHECK([[bison not-reduced.y]], 0, [],
    242 [[not-reduced.y: warning: 2 useless nonterminals and 3 useless rules
    243 not-reduced.y:14.1-13: warning: useless nonterminal: not_reachable
    244 not-reduced.y:11.6-19: warning: useless nonterminal: non_productive
    245 not-reduced.y:11.6-57: warning: useless rule: exp: non_productive
    246 not-reduced.y:14.16-56: warning: useless rule: not_reachable: useful
    247 not-reduced.y:17.17-18.63: warning: useless rule: non_productive: non_productive useless_token
    248 ]])
    249 
    250 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
    251 [[Useless nonterminals
    252    not_reachable
    253    non_productive
    254 Terminals which are not used
    255    useless_token
    256 Useless rules
    257     2 exp: non_productive
    258     3 not_reachable: useful
    259     4 non_productive: non_productive useless_token
    260 ]])
    261 
    262 # The reduced grammar.
    263 # --------------------
    264 AT_DATA([[reduced.y]],
    265 [[/* A useless token. */
    266 %token useless_token
    267 /* A useful one. */
    268 %token useful
    269 %verbose
    270 %output="reduced.c"
    271 
    272 %%
    273 
    274 exp: useful            { /* A useful action. */ }
    275 //   | non_productive    { /* A non productive action. */ } */
    276    ;
    277 
    278 //not_reachable: useful  { /* A not reachable action. */ }
    279 //             ;
    280 
    281 //non_productive: non_productive useless_token
    282 //                       { /* Another non productive action. */ }
    283 //              ;
    284 %%
    285 ]])
    286 
    287 AT_CHECK([[bison reduced.y]])
    288 
    289 # Comparing the parsers.
    290 cp reduced.c expout
    291 AT_CHECK([sed 's/not-reduced/reduced/g' not-reduced.c], 0, [expout])
    292 
    293 AT_CLEANUP
    294 
    295 
    296 
    297 ## ------------------- ##
    298 ## Underivable Rules.  ##
    299 ## ------------------- ##
    300 
    301 AT_SETUP([Underivable Rules])
    302 
    303 AT_KEYWORDS([report])
    304 
    305 AT_DATA([[input.y]],
    306 [[%verbose
    307 %output="input.c"
    308 %token useful
    309 %%
    310 exp: useful | underivable;
    311 underivable: indirection;
    312 indirection: underivable;
    313 ]])
    314 
    315 AT_CHECK([[bison input.y]], 0, [],
    316 [[input.y: warning: 2 useless nonterminals and 3 useless rules
    317 input.y:5.15-25: warning: useless nonterminal: underivable
    318 input.y:6.14-24: warning: useless nonterminal: indirection
    319 input.y:5.15-25: warning: useless rule: exp: underivable
    320 input.y:6.14-24: warning: useless rule: underivable: indirection
    321 input.y:7.14-24: warning: useless rule: indirection: underivable
    322 ]])
    323 
    324 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
    325 [[Useless nonterminals
    326    underivable
    327    indirection
    328 Useless rules
    329     2 exp: underivable
    330     3 underivable: indirection
    331     4 indirection: underivable
    332 ]])
    333 
    334 AT_CLEANUP
    335 
    336 
    337 
    338 ## ---------------- ##
    339 ## Empty Language.  ##
    340 ## ---------------- ##
    341 
    342 AT_SETUP([Empty Language])
    343 
    344 AT_DATA([[input.y]],
    345 [[%output="input.c"
    346 %%
    347 exp: exp;
    348 ]])
    349 
    350 AT_CHECK([[bison input.y]], 1, [],
    351 [[input.y: warning: 2 useless nonterminals and 2 useless rules
    352 input.y:3.1-3: fatal error: start symbol exp does not derive any sentence
    353 ]])
    354 
    355 AT_CLEANUP
    356