• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
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
47AT_CHECK([[bison input.y]])
48
49AT_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
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
91AT_CHECK([[bison input.y]], 0, [],
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
102]])
103
104AT_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
117AT_CLEANUP
118
119
120
121## --------------- ##
122## Useless Rules.  ##
123## --------------- ##
124
125AT_SETUP([Useless Rules])
126
127AT_KEYWORDS([report])
128
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, [],
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
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'
166]])
167
168AT_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
179Terminals which are not used
180   '1'
181   '2'
182   '3'
183   '4'
184   '5'
185   '6'
186   '7'
187   '8'
188   '9'
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'
199]])
200
201AT_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
212AT_SETUP([Reduced Automaton])
213
214AT_KEYWORDS([report])
215
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              ;
238%%
239]])
240
241AT_CHECK([[bison not-reduced.y]], 0, [],
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
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
248]])
249
250AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
251[[Useless nonterminals
252   not_reachable
253   non_productive
254Terminals which are not used
255   useless_token
256Useless 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# --------------------
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//              ;
284%%
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
297## ------------------- ##
298## Underivable Rules.  ##
299## ------------------- ##
300
301AT_SETUP([Underivable Rules])
302
303AT_KEYWORDS([report])
304
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, [],
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
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
322]])
323
324AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
325[[Useless nonterminals
326   underivable
327   indirection
328Useless rules
329    2 exp: underivable
330    3 underivable: indirection
331    4 indirection: underivable
332]])
333
334AT_CLEANUP
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
356