]> git.saurik.com Git - bison.git/blame_incremental - tests/reduce.at
* src/output.c (output_unsigned_int_table): New.
[bison.git] / tests / reduce.at
... / ...
CommitLineData
1# Exercising Bison Grammar Reduction. -*- Autotest -*-
2# Copyright 2001 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., 59 Temple Place - Suite 330, Boston, MA
17# 02111-1307, 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 contains 9 useless nonterminals
93]])
94
95AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
96[[Useless nonterminals:
97 useless1
98 useless2
99 useless3
100 useless4
101 useless5
102 useless6
103 useless7
104 useless8
105 useless9
106]])
107
108AT_CLEANUP
109
110
111
112## --------------- ##
113## Useless Rules. ##
114## --------------- ##
115
116AT_SETUP([Useless Rules])
117
118AT_DATA([[input.y]],
119[[%verbose
120%output="input.c"
121%token useful
122%%
123exp: useful;
124useless1: '1';
125useless2: '2';
126useless3: '3';
127useless4: '4';
128useless5: '5';
129useless6: '6';
130useless7: '7';
131useless8: '8';
132useless9: '9';
133]])
134
135AT_CHECK([[bison input.y]], 0, [],
136[[input.y contains 9 useless nonterminals and 9 useless rules
137]])
138
139AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
140[[Useless nonterminals:
141 useless1
142 useless2
143 useless3
144 useless4
145 useless5
146 useless6
147 useless7
148 useless8
149 useless9
150Terminals which are not used:
151 '1'
152 '2'
153 '3'
154 '4'
155 '5'
156 '6'
157 '7'
158 '8'
159 '9'
160Useless rules:
161#2 useless1: '1';
162#3 useless2: '2';
163#4 useless3: '3';
164#5 useless4: '4';
165#6 useless5: '5';
166#7 useless6: '6';
167#8 useless7: '7';
168#9 useless8: '8';
169#10 useless9: '9';
170]])
171
172AT_CLEANUP
173
174
175
176## ------------------- ##
177## Reduced Automaton. ##
178## ------------------- ##
179
180# Check that the automaton is that as the for the grammar reduced by
181# hand.
182
183AT_SETUP([Reduced Automaton])
184
185# The non reduced grammar.
186# ------------------------
187AT_DATA([[not-reduced.y]],
188[[/* A useless token. */
189%token useless_token
190/* A useful one. */
191%token useful
192%verbose
193%output="not-reduced.c"
194
195%%
196
197exp: useful { /* A useful action. */ }
198 | non_productive { /* A non productive action. */ }
199 ;
200
201not_reachable: useful { /* A not reachable action. */ }
202 ;
203
204non_productive: non_productive useless_token
205 { /* Another non productive action. */ }
206 ;
207]])
208
209AT_CHECK([[bison not-reduced.y]], 0, [],
210[[not-reduced.y contains 2 useless nonterminals and 3 useless rules
211]])
212
213AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
214[[Useless nonterminals:
215 not_reachable
216 non_productive
217Terminals which are not used:
218 useless_token
219Useless rules:
220#2 exp: non_productive;
221#3 not_reachable: useful;
222#4 non_productive: non_productive useless_token;
223]])
224
225# The reduced grammar.
226# --------------------
227AT_DATA([[reduced.y]],
228[[/* A useless token. */
229%token useless_token
230/* A useful one. */
231%token useful
232%verbose
233%output="reduced.c"
234
235%%
236
237exp: useful { /* A useful action. */ }
238// | non_productive { /* A non productive action. */ } */
239 ;
240
241//not_reachable: useful { /* A not reachable action. */ }
242// ;
243
244//non_productive: non_productive useless_token
245// { /* Another non productive action. */ }
246// ;
247]])
248
249AT_CHECK([[bison reduced.y]])
250
251# Comparing the parsers.
252cp reduced.c expout
253AT_CHECK([sed 's/not-reduced/reduced/g' not-reduced.c], 0, [expout])
254
255AT_CLEANUP
256
257
258
259## ------------------- ##
260## Underivable Rules. ##
261## ------------------- ##
262
263AT_SETUP([Underivable Rules])
264
265AT_DATA([[input.y]],
266[[%verbose
267%output="input.c"
268%token useful
269%%
270exp: useful | underivable;
271underivable: indirection;
272indirection: underivable;
273]])
274
275AT_CHECK([[bison input.y]], 0, [],
276[[input.y contains 2 useless nonterminals and 3 useless rules
277]])
278
279AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
280[[Useless nonterminals:
281 underivable
282 indirection
283Useless rules:
284#2 exp: underivable;
285#3 underivable: indirection;
286#4 indirection: underivable;
287]])
288
289AT_CLEANUP