Get rid of (yy)rhs and (yy)prhs.
[bison/ericb.git] / tests / reduce.at
blob5fe650a894abebe4b49bb9c2ee93da33ae640ec9
1 # Exercising Bison Grammar Reduction.                      -*- Autotest -*-
2 # Copyright (C) 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
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.
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.
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/>.
17 AT_BANNER([[Grammar Reduction.]])
20 ## ------------------- ##
21 ## Useless Terminals.  ##
22 ## ------------------- ##
24 AT_SETUP([Useless Terminals])
26 AT_DATA([[input.y]],
27 [[%verbose
28 %output "input.c"
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
40 %token useful
42 exp: useful;
43 ]])
45 AT_BISON_CHECK([[input.y]])
47 AT_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 ]])
60 AT_CLEANUP
64 ## ---------------------- ##
65 ## Useless Nonterminals.  ##
66 ## ---------------------- ##
68 AT_SETUP([Useless Nonterminals])
70 AT_DATA([[input.y]],
71 [[%verbose
72 %output "input.c"
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
84 %token useful
86 exp: useful;
87 ]])
89 AT_BISON_CHECK([[input.y]], 0, [],
90 [[input.y: warning: 9 nonterminals useless in grammar
91 input.y:4.8-15: warning: nonterminal useless in grammar: useless1
92 input.y:5.8-15: warning: nonterminal useless in grammar: useless2
93 input.y:6.8-15: warning: nonterminal useless in grammar: useless3
94 input.y:7.8-15: warning: nonterminal useless in grammar: useless4
95 input.y:8.8-15: warning: nonterminal useless in grammar: useless5
96 input.y:9.8-15: warning: nonterminal useless in grammar: useless6
97 input.y:10.8-15: warning: nonterminal useless in grammar: useless7
98 input.y:11.8-15: warning: nonterminal useless in grammar: useless8
99 input.y:12.8-15: warning: nonterminal useless in grammar: useless9
102 AT_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
115 AT_CLEANUP
119 ## --------------- ##
120 ## Useless Rules.  ##
121 ## --------------- ##
123 AT_SETUP([Useless Rules])
125 AT_KEYWORDS([report])
127 AT_DATA([[input.y]],
128 [[%verbose
129 %output "input.c"
130 %token useful
132 exp: useful;
133 useless1: '1';
134 useless2: '2';
135 useless3: '3';
136 useless4: '4';
137 useless5: '5';
138 useless6: '6';
139 useless7: '7';
140 useless8: '8';
141 useless9: '9';
144 AT_BISON_CHECK([[input.y]], 0, [],
145 [[input.y: warning: 9 nonterminals useless in grammar
146 input.y: warning: 9 rules useless in grammar
147 input.y:6.1-8: warning: nonterminal useless in grammar: useless1
148 input.y:7.1-8: warning: nonterminal useless in grammar: useless2
149 input.y:8.1-8: warning: nonterminal useless in grammar: useless3
150 input.y:9.1-8: warning: nonterminal useless in grammar: useless4
151 input.y:10.1-8: warning: nonterminal useless in grammar: useless5
152 input.y:11.1-8: warning: nonterminal useless in grammar: useless6
153 input.y:12.1-8: warning: nonterminal useless in grammar: useless7
154 input.y:13.1-8: warning: nonterminal useless in grammar: useless8
155 input.y:14.1-8: warning: nonterminal useless in grammar: useless9
156 input.y:6.11-13: warning: rule useless in grammar: useless1: '1'
157 input.y:7.11-13: warning: rule useless in grammar: useless2: '2'
158 input.y:8.11-13: warning: rule useless in grammar: useless3: '3'
159 input.y:9.11-13: warning: rule useless in grammar: useless4: '4'
160 input.y:10.11-13: warning: rule useless in grammar: useless5: '5'
161 input.y:11.11-13: warning: rule useless in grammar: useless6: '6'
162 input.y:12.11-13: warning: rule useless in grammar: useless7: '7'
163 input.y:13.11-13: warning: rule useless in grammar: useless8: '8'
164 input.y:14.11-13: warning: rule useless in grammar: useless9: '9'
167 AT_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
178 Terminals unused in grammar
179    '1'
180    '2'
181    '3'
182    '4'
183    '5'
184    '6'
185    '7'
186    '8'
187    '9'
188 Rules 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'
200 AT_CLEANUP
204 ## ------------------- ##
205 ## Reduced Automaton.  ##
206 ## ------------------- ##
208 # Check that the automaton is that as the for the grammar reduced by
209 # hand.
211 AT_SETUP([Reduced Automaton])
213 AT_KEYWORDS([report])
215 # The non reduced grammar.
216 # ------------------------
217 AT_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"
227 exp: useful            { /* A useful action. */ }
228    | non_productive    { /* A non productive action. */ }
229    ;
231 not_reachable: useful  { /* A not reachable action. */ }
232              ;
234 non_productive: non_productive useless_token
235                        { /* Another non productive action. */ }
236               ;
240 AT_BISON_CHECK([[not-reduced.y]], 0, [],
241 [[not-reduced.y: warning: 2 nonterminals useless in grammar
242 not-reduced.y: warning: 3 rules useless in grammar
243 not-reduced.y:14.1-13: warning: nonterminal useless in grammar: not_reachable
244 not-reduced.y:11.6-19: warning: nonterminal useless in grammar: non_productive
245 not-reduced.y:11.6-57: warning: rule useless in grammar: exp: non_productive
246 not-reduced.y:14.16-56: warning: rule useless in grammar: not_reachable: useful
247 not-reduced.y:17.17-18.63: warning: rule useless in grammar: non_productive: non_productive useless_token
250 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
251 [[Nonterminals useless in grammar
252    not_reachable
253    non_productive
254 Terminals unused in grammar
255    useless_token
256 Rules useless in grammar
257     2 exp: non_productive
258     3 not_reachable: useful
259     4 non_productive: non_productive useless_token
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"
274 exp: useful            { /* A useful action. */ }
275 //   | non_productive    { /* A non productive action. */ } */
276    ;
278 //not_reachable: useful  { /* A not reachable action. */ }
279 //             ;
281 //non_productive: non_productive useless_token
282 //                       { /* Another non productive action. */ }
283 //              ;
287 AT_BISON_CHECK([[reduced.y]])
289 # Comparing the parsers.
290 cp reduced.c expout
291 AT_CHECK([sed 's/not-reduced/reduced/g' not-reduced.c], 0, [expout])
293 AT_CLEANUP
297 ## ------------------- ##
298 ## Underivable Rules.  ##
299 ## ------------------- ##
301 AT_SETUP([Underivable Rules])
303 AT_KEYWORDS([report])
305 AT_DATA([[input.y]],
306 [[%verbose
307 %output "input.c"
308 %token useful
310 exp: useful | underivable;
311 underivable: indirection;
312 indirection: underivable;
315 AT_BISON_CHECK([[input.y]], 0, [],
316 [[input.y: warning: 2 nonterminals useless in grammar
317 input.y: warning: 3 rules useless in grammar
318 input.y:5.15-25: warning: nonterminal useless in grammar: underivable
319 input.y:6.14-24: warning: nonterminal useless in grammar: indirection
320 input.y:5.15-25: warning: rule useless in grammar: exp: underivable
321 input.y:6.14-24: warning: rule useless in grammar: underivable: indirection
322 input.y:7.14-24: warning: rule useless in grammar: indirection: underivable
325 AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
326 [[Nonterminals useless in grammar
327    underivable
328    indirection
329 Rules useless in grammar
330     2 exp: underivable
331     3 underivable: indirection
332     4 indirection: underivable
335 AT_CLEANUP
339 ## ---------------- ##
340 ## Empty Language.  ##
341 ## ---------------- ##
343 AT_SETUP([Empty Language])
345 AT_DATA([[input.y]],
346 [[%output "input.c"
348 exp: exp;
351 AT_BISON_CHECK([[input.y]], 1, [],
352 [[input.y: warning: 2 nonterminals useless in grammar
353 input.y: warning: 2 rules useless in grammar
354 input.y:3.1-3: fatal error: start symbol exp does not derive any sentence
357 AT_CLEANUP