]> git.saurik.com Git - bison.git/blame - tests/reduce.at
* data/glr.c (yyreturn): Use "Cleanup:" rather than "Error:"
[bison.git] / tests / reduce.at
CommitLineData
cb4956ee 1# Exercising Bison Grammar Reduction. -*- Autotest -*-
e551232e 2# Copyright (C) 2001, 2002 Free Software Foundation, Inc.
cb4956ee
AD
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
0fb669f9
PE
16# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17# 02110-1301, USA.
cb4956ee
AD
18
19AT_BANNER([[Grammar Reduction.]])
20
21
22## ------------------- ##
23## Useless Terminals. ##
24## ------------------- ##
25
26AT_SETUP([Useless Terminals])
27
28AT_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%%
44exp: useful;
45]])
46
7d13ff5f 47AT_CHECK([[bison input.y]])
cb4956ee
AD
48
49AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
c8f002c7 50[[Terminals which are not used
cb4956ee
AD
51 useless1
52 useless2
53 useless3
54 useless4
55 useless5
56 useless6
57 useless7
58 useless8
59 useless9
60]])
61
62AT_CLEANUP
63
64
65
66## ---------------------- ##
67## Useless Nonterminals. ##
68## ---------------------- ##
69
70AT_SETUP([Useless Nonterminals])
71
72AT_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%%
88exp: useful;
89]])
90
760b53a8 91AT_CHECK([[bison input.y]], 0, [],
6b98e4b5
AD
92[[input.y: warning: 9 useless nonterminals
93input.y:4.8-15: warning: useless nonterminal: useless1
94input.y:5.8-15: warning: useless nonterminal: useless2
95input.y:6.8-15: warning: useless nonterminal: useless3
96input.y:7.8-15: warning: useless nonterminal: useless4
97input.y:8.8-15: warning: useless nonterminal: useless5
98input.y:9.8-15: warning: useless nonterminal: useless6
99input.y:10.8-15: warning: useless nonterminal: useless7
100input.y:11.8-15: warning: useless nonterminal: useless8
101input.y:12.8-15: warning: useless nonterminal: useless9
760b53a8 102]])
cb4956ee
AD
103
104AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
c8f002c7 105[[Useless nonterminals
cb4956ee
AD
106 useless1
107 useless2
108 useless3
109 useless4
110 useless5
111 useless6
112 useless7
113 useless8
114 useless9
115]])
116
117AT_CLEANUP
68f1e3ed
AD
118
119
120
121## --------------- ##
122## Useless Rules. ##
123## --------------- ##
124
125AT_SETUP([Useless Rules])
126
9757c359
AD
127AT_KEYWORDS([report])
128
68f1e3ed
AD
129AT_DATA([[input.y]],
130[[%verbose
131%output="input.c"
132%token useful
133%%
134exp: useful;
135useless1: '1';
136useless2: '2';
137useless3: '3';
138useless4: '4';
139useless5: '5';
140useless6: '6';
141useless7: '7';
142useless8: '8';
143useless9: '9';
144]])
145
146AT_CHECK([[bison input.y]], 0, [],
6b98e4b5
AD
147[[input.y: warning: 9 useless nonterminals and 9 useless rules
148input.y:6.1-8: warning: useless nonterminal: useless1
149input.y:7.1-8: warning: useless nonterminal: useless2
150input.y:8.1-8: warning: useless nonterminal: useless3
151input.y:9.1-8: warning: useless nonterminal: useless4
152input.y:10.1-8: warning: useless nonterminal: useless5
153input.y:11.1-8: warning: useless nonterminal: useless6
154input.y:12.1-8: warning: useless nonterminal: useless7
155input.y:13.1-8: warning: useless nonterminal: useless8
156input.y:14.1-8: warning: useless nonterminal: useless9
e551232e
PE
157input.y:6.11-13: warning: useless rule: useless1: '1'
158input.y:7.11-13: warning: useless rule: useless2: '2'
159input.y:8.11-13: warning: useless rule: useless3: '3'
160input.y:9.11-13: warning: useless rule: useless4: '4'
161input.y:10.11-13: warning: useless rule: useless5: '5'
162input.y:11.11-13: warning: useless rule: useless6: '6'
163input.y:12.11-13: warning: useless rule: useless7: '7'
164input.y:13.11-13: warning: useless rule: useless8: '8'
165input.y:14.11-13: warning: useless rule: useless9: '9'
68f1e3ed
AD
166]])
167
168AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
c8f002c7 169[[Useless nonterminals
68f1e3ed
AD
170 useless1
171 useless2
172 useless3
173 useless4
174 useless5
175 useless6
176 useless7
177 useless8
178 useless9
c8f002c7 179Terminals which are not used
68f1e3ed
AD
180 '1'
181 '2'
182 '3'
183 '4'
184 '5'
185 '6'
186 '7'
187 '8'
188 '9'
9757c359
AD
189Useless 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'
68f1e3ed
AD
199]])
200
201AT_CLEANUP
202
203
204
c3b407f4
AD
205## ------------------- ##
206## Reduced Automaton. ##
207## ------------------- ##
208
209# Check that the automaton is that as the for the grammar reduced by
210# hand.
211
212AT_SETUP([Reduced Automaton])
213
9757c359
AD
214AT_KEYWORDS([report])
215
c3b407f4
AD
216# The non reduced grammar.
217# ------------------------
218AT_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
228exp: useful { /* A useful action. */ }
229 | non_productive { /* A non productive action. */ }
230 ;
231
232not_reachable: useful { /* A not reachable action. */ }
233 ;
234
235non_productive: non_productive useless_token
236 { /* Another non productive action. */ }
237 ;
e9955c83 238%%
c3b407f4
AD
239]])
240
241AT_CHECK([[bison not-reduced.y]], 0, [],
6b98e4b5
AD
242[[not-reduced.y: warning: 2 useless nonterminals and 3 useless rules
243not-reduced.y:14.1-13: warning: useless nonterminal: not_reachable
244not-reduced.y:11.6-19: warning: useless nonterminal: non_productive
e551232e
PE
245not-reduced.y:11.6-57: warning: useless rule: exp: non_productive
246not-reduced.y:14.16-56: warning: useless rule: not_reachable: useful
247not-reduced.y:17.17-18.63: warning: useless rule: non_productive: non_productive useless_token
c3b407f4
AD
248]])
249
250AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
c8f002c7 251[[Useless nonterminals
c3b407f4
AD
252 not_reachable
253 non_productive
c8f002c7 254Terminals which are not used
c3b407f4 255 useless_token
9757c359
AD
256Useless rules
257 2 exp: non_productive
258 3 not_reachable: useful
259 4 non_productive: non_productive useless_token
c3b407f4
AD
260]])
261
262# The reduced grammar.
263# --------------------
264AT_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
274exp: 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// ;
e9955c83 284%%
c3b407f4
AD
285]])
286
287AT_CHECK([[bison reduced.y]])
288
289# Comparing the parsers.
290cp reduced.c expout
291AT_CHECK([sed 's/not-reduced/reduced/g' not-reduced.c], 0, [expout])
292
293AT_CLEANUP
294
295
296
68f1e3ed
AD
297## ------------------- ##
298## Underivable Rules. ##
299## ------------------- ##
300
301AT_SETUP([Underivable Rules])
302
9757c359
AD
303AT_KEYWORDS([report])
304
68f1e3ed
AD
305AT_DATA([[input.y]],
306[[%verbose
307%output="input.c"
308%token useful
309%%
310exp: useful | underivable;
311underivable: indirection;
312indirection: underivable;
313]])
314
315AT_CHECK([[bison input.y]], 0, [],
6b98e4b5
AD
316[[input.y: warning: 2 useless nonterminals and 3 useless rules
317input.y:5.15-25: warning: useless nonterminal: underivable
318input.y:6.14-24: warning: useless nonterminal: indirection
e551232e
PE
319input.y:5.15-25: warning: useless rule: exp: underivable
320input.y:6.14-24: warning: useless rule: underivable: indirection
321input.y:7.14-24: warning: useless rule: indirection: underivable
68f1e3ed
AD
322]])
323
324AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
c8f002c7 325[[Useless nonterminals
68f1e3ed
AD
326 underivable
327 indirection
9757c359
AD
328Useless rules
329 2 exp: underivable
330 3 underivable: indirection
331 4 indirection: underivable
68f1e3ed
AD
332]])
333
334AT_CLEANUP
1bfb97db
AD
335
336
337
338## ---------------- ##
339## Empty Language. ##
340## ---------------- ##
341
342AT_SETUP([Empty Language])
343
344AT_DATA([[input.y]],
345[[%output="input.c"
346%%
347exp: exp;
348]])
349
350AT_CHECK([[bison input.y]], 1, [],
351[[input.y: warning: 2 useless nonterminals and 2 useless rules
352input.y:3.1-3: fatal error: start symbol exp does not derive any sentence
353]])
354
355AT_CLEANUP