]> git.saurik.com Git - bison.git/blob - tests/reduce.at
* src/scan-gram.l: Be robust to BRACED_CODE appearing before any
[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 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