]> git.saurik.com Git - bison.git/blame_incremental - tests/reduce.at
Partial m4sugar merge from autoconf: m4_map.
[bison.git] / tests / reduce.at
... / ...
CommitLineData
1# Exercising Bison Grammar Reduction. -*- Autotest -*-
2# Copyright (C) 2001, 2002, 2007, 2008 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
17AT_BANNER([[Grammar Reduction.]])
18
19
20## ------------------- ##
21## Useless Terminals. ##
22## ------------------- ##
23
24AT_SETUP([Useless Terminals])
25
26AT_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%%
42exp: useful;
43]])
44
45AT_BISON_CHECK([[input.y]])
46
47AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
48[[Terminals unused in grammar
49 useless1
50 useless2
51 useless3
52 useless4
53 useless5
54 useless6
55 useless7
56 useless8
57 useless9
58]])
59
60AT_CLEANUP
61
62
63
64## ---------------------- ##
65## Useless Nonterminals. ##
66## ---------------------- ##
67
68AT_SETUP([Useless Nonterminals])
69
70AT_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%%
86exp: useful;
87]])
88
89AT_BISON_CHECK([[input.y]], 0, [],
90[[input.y: warning: 9 nonterminals useless in grammar
91input.y:4.8-15: warning: nonterminal useless in grammar: useless1
92input.y:5.8-15: warning: nonterminal useless in grammar: useless2
93input.y:6.8-15: warning: nonterminal useless in grammar: useless3
94input.y:7.8-15: warning: nonterminal useless in grammar: useless4
95input.y:8.8-15: warning: nonterminal useless in grammar: useless5
96input.y:9.8-15: warning: nonterminal useless in grammar: useless6
97input.y:10.8-15: warning: nonterminal useless in grammar: useless7
98input.y:11.8-15: warning: nonterminal useless in grammar: useless8
99input.y:12.8-15: warning: nonterminal useless in grammar: useless9
100]])
101
102AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
103[[Nonterminals useless in grammar
104 useless1
105 useless2
106 useless3
107 useless4
108 useless5
109 useless6
110 useless7
111 useless8
112 useless9
113]])
114
115AT_CLEANUP
116
117
118
119## --------------- ##
120## Useless Rules. ##
121## --------------- ##
122
123AT_SETUP([Useless Rules])
124
125AT_KEYWORDS([report])
126
127AT_DATA([[input.y]],
128[[%verbose
129%output "input.c"
130%token useful
131%%
132exp: useful;
133useless1: '1';
134useless2: '2';
135useless3: '3';
136useless4: '4';
137useless5: '5';
138useless6: '6';
139useless7: '7';
140useless8: '8';
141useless9: '9';
142]])
143
144AT_BISON_CHECK([[input.y]], 0, [],
145[[input.y: warning: 9 nonterminals useless in grammar
146input.y: warning: 9 rules useless in grammar
147input.y:6.1-8: warning: nonterminal useless in grammar: useless1
148input.y:7.1-8: warning: nonterminal useless in grammar: useless2
149input.y:8.1-8: warning: nonterminal useless in grammar: useless3
150input.y:9.1-8: warning: nonterminal useless in grammar: useless4
151input.y:10.1-8: warning: nonterminal useless in grammar: useless5
152input.y:11.1-8: warning: nonterminal useless in grammar: useless6
153input.y:12.1-8: warning: nonterminal useless in grammar: useless7
154input.y:13.1-8: warning: nonterminal useless in grammar: useless8
155input.y:14.1-8: warning: nonterminal useless in grammar: useless9
156input.y:6.11-13: warning: rule useless in grammar: useless1: '1'
157input.y:7.11-13: warning: rule useless in grammar: useless2: '2'
158input.y:8.11-13: warning: rule useless in grammar: useless3: '3'
159input.y:9.11-13: warning: rule useless in grammar: useless4: '4'
160input.y:10.11-13: warning: rule useless in grammar: useless5: '5'
161input.y:11.11-13: warning: rule useless in grammar: useless6: '6'
162input.y:12.11-13: warning: rule useless in grammar: useless7: '7'
163input.y:13.11-13: warning: rule useless in grammar: useless8: '8'
164input.y:14.11-13: warning: rule useless in grammar: useless9: '9'
165]])
166
167AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
168[[Nonterminals useless in grammar
169 useless1
170 useless2
171 useless3
172 useless4
173 useless5
174 useless6
175 useless7
176 useless8
177 useless9
178Terminals unused in grammar
179 '1'
180 '2'
181 '3'
182 '4'
183 '5'
184 '6'
185 '7'
186 '8'
187 '9'
188Rules useless in grammar
189 2 useless1: '1'
190 3 useless2: '2'
191 4 useless3: '3'
192 5 useless4: '4'
193 6 useless5: '5'
194 7 useless6: '6'
195 8 useless7: '7'
196 9 useless8: '8'
197 10 useless9: '9'
198]])
199
200AT_CLEANUP
201
202
203
204## ------------------- ##
205## Reduced Automaton. ##
206## ------------------- ##
207
208# Check that the automaton is that as the for the grammar reduced by
209# hand.
210
211AT_SETUP([Reduced Automaton])
212
213AT_KEYWORDS([report])
214
215# The non reduced grammar.
216# ------------------------
217AT_DATA([[not-reduced.y]],
218[[/* A useless token. */
219%token useless_token
220/* A useful one. */
221%token useful
222%verbose
223%output "not-reduced.c"
224
225%%
226
227exp: useful { /* A useful action. */ }
228 | non_productive { /* A non productive action. */ }
229 ;
230
231not_reachable: useful { /* A not reachable action. */ }
232 ;
233
234non_productive: non_productive useless_token
235 { /* Another non productive action. */ }
236 ;
237%%
238]])
239
240AT_BISON_CHECK([[not-reduced.y]], 0, [],
241[[not-reduced.y: warning: 2 nonterminals useless in grammar
242not-reduced.y: warning: 3 rules useless in grammar
243not-reduced.y:14.1-13: warning: nonterminal useless in grammar: not_reachable
244not-reduced.y:11.6-19: warning: nonterminal useless in grammar: non_productive
245not-reduced.y:11.6-57: warning: rule useless in grammar: exp: non_productive
246not-reduced.y:14.16-56: warning: rule useless in grammar: not_reachable: useful
247not-reduced.y:17.17-18.63: warning: rule useless in grammar: non_productive: non_productive useless_token
248]])
249
250AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
251[[Nonterminals useless in grammar
252 not_reachable
253 non_productive
254Terminals unused in grammar
255 useless_token
256Rules useless in grammar
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_BISON_CHECK([[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_BISON_CHECK([[input.y]], 0, [],
316[[input.y: warning: 2 nonterminals useless in grammar
317input.y: warning: 3 rules useless in grammar
318input.y:5.15-25: warning: nonterminal useless in grammar: underivable
319input.y:6.14-24: warning: nonterminal useless in grammar: indirection
320input.y:5.15-25: warning: rule useless in grammar: exp: underivable
321input.y:6.14-24: warning: rule useless in grammar: underivable: indirection
322input.y:7.14-24: warning: rule useless in grammar: indirection: underivable
323]])
324
325AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
326[[Nonterminals useless in grammar
327 underivable
328 indirection
329Rules useless in grammar
330 2 exp: underivable
331 3 underivable: indirection
332 4 indirection: underivable
333]])
334
335AT_CLEANUP
336
337
338
339## ---------------- ##
340## Empty Language. ##
341## ---------------- ##
342
343AT_SETUP([Empty Language])
344
345AT_DATA([[input.y]],
346[[%output "input.c"
347%%
348exp: exp;
349]])
350
351AT_BISON_CHECK([[input.y]], 1, [],
352[[input.y: warning: 2 nonterminals useless in grammar
353input.y: warning: 2 rules useless in grammar
354input.y:3.1-3: fatal error: start symbol exp does not derive any sentence
355]])
356
357AT_CLEANUP