]> git.saurik.com Git - bison.git/blob - tests/reduce.at
For the XML output's terminal element, rename @number to @token-number,
[bison.git] / tests / reduce.at
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 3 of the License, or
7 # (at your option) 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, see <http://www.gnu.org/licenses/>.
16
17 AT_BANNER([[Grammar Reduction.]])
18
19
20 ## ------------------- ##
21 ## Useless Terminals. ##
22 ## ------------------- ##
23
24 AT_SETUP([Useless Terminals])
25
26 AT_DATA([[input.y]],
27 [[%verbose
28 %output "input.c"
29
30 %token useless1
31 %token useless2
32 %token useless3
33 %token useless4
34 %token useless5
35 %token useless6
36 %token useless7
37 %token useless8
38 %token useless9
39
40 %token useful
41 %%
42 exp: useful;
43 ]])
44
45 AT_CHECK([[bison input.y]])
46
47 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
48 [[Terminals which are not used
49 useless1
50 useless2
51 useless3
52 useless4
53 useless5
54 useless6
55 useless7
56 useless8
57 useless9
58 ]])
59
60 AT_CLEANUP
61
62
63
64 ## ---------------------- ##
65 ## Useless Nonterminals. ##
66 ## ---------------------- ##
67
68 AT_SETUP([Useless Nonterminals])
69
70 AT_DATA([[input.y]],
71 [[%verbose
72 %output "input.c"
73
74 %nterm useless1
75 %nterm useless2
76 %nterm useless3
77 %nterm useless4
78 %nterm useless5
79 %nterm useless6
80 %nterm useless7
81 %nterm useless8
82 %nterm useless9
83
84 %token useful
85 %%
86 exp: useful;
87 ]])
88
89 AT_CHECK([[bison input.y]], 0, [],
90 [[input.y: warning: 9 useless nonterminals
91 input.y:4.8-15: warning: useless nonterminal: useless1
92 input.y:5.8-15: warning: useless nonterminal: useless2
93 input.y:6.8-15: warning: useless nonterminal: useless3
94 input.y:7.8-15: warning: useless nonterminal: useless4
95 input.y:8.8-15: warning: useless nonterminal: useless5
96 input.y:9.8-15: warning: useless nonterminal: useless6
97 input.y:10.8-15: warning: useless nonterminal: useless7
98 input.y:11.8-15: warning: useless nonterminal: useless8
99 input.y:12.8-15: warning: useless nonterminal: useless9
100 ]])
101
102 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
103 [[Useless nonterminals
104 useless1
105 useless2
106 useless3
107 useless4
108 useless5
109 useless6
110 useless7
111 useless8
112 useless9
113 ]])
114
115 AT_CLEANUP
116
117
118
119 ## --------------- ##
120 ## Useless Rules. ##
121 ## --------------- ##
122
123 AT_SETUP([Useless Rules])
124
125 AT_KEYWORDS([report])
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.11-13: warning: useless rule: useless1: '1'
156 input.y:7.11-13: warning: useless rule: useless2: '2'
157 input.y:8.11-13: warning: useless rule: useless3: '3'
158 input.y:9.11-13: warning: useless rule: useless4: '4'
159 input.y:10.11-13: warning: useless rule: useless5: '5'
160 input.y:11.11-13: warning: useless rule: useless6: '6'
161 input.y:12.11-13: warning: useless rule: useless7: '7'
162 input.y:13.11-13: warning: useless rule: useless8: '8'
163 input.y:14.11-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 AT_KEYWORDS([report])
213
214 # The non reduced grammar.
215 # ------------------------
216 AT_DATA([[not-reduced.y]],
217 [[/* A useless token. */
218 %token useless_token
219 /* A useful one. */
220 %token useful
221 %verbose
222 %output "not-reduced.c"
223
224 %%
225
226 exp: useful { /* A useful action. */ }
227 | non_productive { /* A non productive action. */ }
228 ;
229
230 not_reachable: useful { /* A not reachable action. */ }
231 ;
232
233 non_productive: non_productive useless_token
234 { /* Another non productive action. */ }
235 ;
236 %%
237 ]])
238
239 AT_CHECK([[bison not-reduced.y]], 0, [],
240 [[not-reduced.y: warning: 2 useless nonterminals and 3 useless rules
241 not-reduced.y:14.1-13: warning: useless nonterminal: not_reachable
242 not-reduced.y:11.6-19: warning: useless nonterminal: non_productive
243 not-reduced.y:11.6-57: warning: useless rule: exp: non_productive
244 not-reduced.y:14.16-56: warning: useless rule: not_reachable: useful
245 not-reduced.y:17.17-18.63: warning: useless rule: non_productive: non_productive useless_token
246 ]])
247
248 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
249 [[Useless nonterminals
250 not_reachable
251 non_productive
252 Terminals which are not used
253 useless_token
254 Useless rules
255 2 exp: non_productive
256 3 not_reachable: useful
257 4 non_productive: non_productive useless_token
258 ]])
259
260 # The reduced grammar.
261 # --------------------
262 AT_DATA([[reduced.y]],
263 [[/* A useless token. */
264 %token useless_token
265 /* A useful one. */
266 %token useful
267 %verbose
268 %output "reduced.c"
269
270 %%
271
272 exp: useful { /* A useful action. */ }
273 // | non_productive { /* A non productive action. */ } */
274 ;
275
276 //not_reachable: useful { /* A not reachable action. */ }
277 // ;
278
279 //non_productive: non_productive useless_token
280 // { /* Another non productive action. */ }
281 // ;
282 %%
283 ]])
284
285 AT_CHECK([[bison reduced.y]])
286
287 # Comparing the parsers.
288 cp reduced.c expout
289 AT_CHECK([sed 's/not-reduced/reduced/g' not-reduced.c], 0, [expout])
290
291 AT_CLEANUP
292
293
294
295 ## ------------------- ##
296 ## Underivable Rules. ##
297 ## ------------------- ##
298
299 AT_SETUP([Underivable Rules])
300
301 AT_KEYWORDS([report])
302
303 AT_DATA([[input.y]],
304 [[%verbose
305 %output "input.c"
306 %token useful
307 %%
308 exp: useful | underivable;
309 underivable: indirection;
310 indirection: underivable;
311 ]])
312
313 AT_CHECK([[bison input.y]], 0, [],
314 [[input.y: warning: 2 useless nonterminals and 3 useless rules
315 input.y:5.15-25: warning: useless nonterminal: underivable
316 input.y:6.14-24: warning: useless nonterminal: indirection
317 input.y:5.15-25: warning: useless rule: exp: underivable
318 input.y:6.14-24: warning: useless rule: underivable: indirection
319 input.y:7.14-24: warning: useless rule: indirection: underivable
320 ]])
321
322 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
323 [[Useless nonterminals
324 underivable
325 indirection
326 Useless rules
327 2 exp: underivable
328 3 underivable: indirection
329 4 indirection: underivable
330 ]])
331
332 AT_CLEANUP
333
334
335
336 ## ---------------- ##
337 ## Empty Language. ##
338 ## ---------------- ##
339
340 AT_SETUP([Empty Language])
341
342 AT_DATA([[input.y]],
343 [[%output "input.c"
344 %%
345 exp: exp;
346 ]])
347
348 AT_CHECK([[bison input.y]], 1, [],
349 [[input.y: warning: 2 useless nonterminals and 2 useless rules
350 input.y:3.1-3: fatal error: start symbol exp does not derive any sentence
351 ]])
352
353 AT_CLEANUP