]> git.saurik.com Git - bison.git/blob - tests/reduce.at
ba9d27edd8e9cbcf0e49ffbf7039a96ac5a05c57
[bison.git] / tests / reduce.at
1 # Exercising Bison Grammar Reduction. -*- Autotest -*-
2 # Copyright 2001 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., 59 Temple Place - Suite 330, Boston, MA
17 # 02111-1307, 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_DATA([[input.y]],
128 [[%verbose
129 %output="input.c"
130 %token useful
131 %%
132 exp: useful;
133 useless1: '1';
134 useless2: '2';
135 useless3: '3';
136 useless4: '4';
137 useless5: '5';
138 useless6: '6';
139 useless7: '7';
140 useless8: '8';
141 useless9: '9';
142 ]])
143
144 AT_CHECK([[bison input.y]], 0, [],
145 [[input.y: warning: 9 useless nonterminals and 9 useless rules
146 input.y:6.1-8: warning: useless nonterminal: useless1
147 input.y:7.1-8: warning: useless nonterminal: useless2
148 input.y:8.1-8: warning: useless nonterminal: useless3
149 input.y:9.1-8: warning: useless nonterminal: useless4
150 input.y:10.1-8: warning: useless nonterminal: useless5
151 input.y:11.1-8: warning: useless nonterminal: useless6
152 input.y:12.1-8: warning: useless nonterminal: useless7
153 input.y:13.1-8: warning: useless nonterminal: useless8
154 input.y:14.1-8: warning: useless nonterminal: useless9
155 input.y:6.9-13: warning: useless rule: useless1: '1'
156 input.y:7.9-13: warning: useless rule: useless2: '2'
157 input.y:8.9-13: warning: useless rule: useless3: '3'
158 input.y:9.9-13: warning: useless rule: useless4: '4'
159 input.y:10.9-13: warning: useless rule: useless5: '5'
160 input.y:11.9-13: warning: useless rule: useless6: '6'
161 input.y:12.9-13: warning: useless rule: useless7: '7'
162 input.y:13.9-13: warning: useless rule: useless8: '8'
163 input.y:14.9-13: warning: useless rule: useless9: '9'
164 ]])
165
166 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
167 [[Useless nonterminals:
168 useless1
169 useless2
170 useless3
171 useless4
172 useless5
173 useless6
174 useless7
175 useless8
176 useless9
177 Terminals which are not used:
178 '1'
179 '2'
180 '3'
181 '4'
182 '5'
183 '6'
184 '7'
185 '8'
186 '9'
187 Useless rules:
188 #2 useless1: '1';
189 #3 useless2: '2';
190 #4 useless3: '3';
191 #5 useless4: '4';
192 #6 useless5: '5';
193 #7 useless6: '6';
194 #8 useless7: '7';
195 #9 useless8: '8';
196 #10 useless9: '9';
197 ]])
198
199 AT_CLEANUP
200
201
202
203 ## ------------------- ##
204 ## Reduced Automaton. ##
205 ## ------------------- ##
206
207 # Check that the automaton is that as the for the grammar reduced by
208 # hand.
209
210 AT_SETUP([Reduced Automaton])
211
212 # The non reduced grammar.
213 # ------------------------
214 AT_DATA([[not-reduced.y]],
215 [[/* A useless token. */
216 %token useless_token
217 /* A useful one. */
218 %token useful
219 %verbose
220 %output="not-reduced.c"
221
222 %%
223
224 exp: useful { /* A useful action. */ }
225 | non_productive { /* A non productive action. */ }
226 ;
227
228 not_reachable: useful { /* A not reachable action. */ }
229 ;
230
231 non_productive: non_productive useless_token
232 { /* Another non productive action. */ }
233 ;
234 %%
235 ]])
236
237 AT_CHECK([[bison not-reduced.y]], 0, [],
238 [[not-reduced.y: warning: 2 useless nonterminals and 3 useless rules
239 not-reduced.y:14.1-13: warning: useless nonterminal: not_reachable
240 not-reduced.y:11.6-19: warning: useless nonterminal: non_productive
241 not-reduced.y:11.4-57: warning: useless rule: exp: non_productive
242 not-reduced.y:14.14-56: warning: useless rule: not_reachable: useful
243 not-reduced.y:17.15-18.63: warning: useless rule: non_productive: non_productive useless_token
244 ]])
245
246 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
247 [[Useless nonterminals:
248 not_reachable
249 non_productive
250 Terminals which are not used:
251 useless_token
252 Useless rules:
253 #2 exp: non_productive;
254 #3 not_reachable: useful;
255 #4 non_productive: non_productive useless_token;
256 ]])
257
258 # The reduced grammar.
259 # --------------------
260 AT_DATA([[reduced.y]],
261 [[/* A useless token. */
262 %token useless_token
263 /* A useful one. */
264 %token useful
265 %verbose
266 %output="reduced.c"
267
268 %%
269
270 exp: useful { /* A useful action. */ }
271 // | non_productive { /* A non productive action. */ } */
272 ;
273
274 //not_reachable: useful { /* A not reachable action. */ }
275 // ;
276
277 //non_productive: non_productive useless_token
278 // { /* Another non productive action. */ }
279 // ;
280 %%
281 ]])
282
283 AT_CHECK([[bison reduced.y]])
284
285 # Comparing the parsers.
286 cp reduced.c expout
287 AT_CHECK([sed 's/not-reduced/reduced/g' not-reduced.c], 0, [expout])
288
289 AT_CLEANUP
290
291
292
293 ## ------------------- ##
294 ## Underivable Rules. ##
295 ## ------------------- ##
296
297 AT_SETUP([Underivable Rules])
298
299 AT_DATA([[input.y]],
300 [[%verbose
301 %output="input.c"
302 %token useful
303 %%
304 exp: useful | underivable;
305 underivable: indirection;
306 indirection: underivable;
307 ]])
308
309 AT_CHECK([[bison input.y]], 0, [],
310 [[input.y: warning: 2 useless nonterminals and 3 useless rules
311 input.y:5.15-25: warning: useless nonterminal: underivable
312 input.y:6.14-24: warning: useless nonterminal: indirection
313 input.y:5.13-25: warning: useless rule: exp: underivable
314 input.y:6.12-24: warning: useless rule: underivable: indirection
315 input.y:7.12-24: warning: useless rule: indirection: underivable
316 ]])
317
318 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
319 [[Useless nonterminals:
320 underivable
321 indirection
322 Useless rules:
323 #2 exp: underivable;
324 #3 underivable: indirection;
325 #4 indirection: underivable;
326 ]])
327
328 AT_CLEANUP