]> git.saurik.com Git - bison.git/blob - tests/conflicts.at
and Akim Demaille <akim@epita.fr>
[bison.git] / tests / conflicts.at
1 # Exercising Bison on conflicts. -*- Autotest -*-
2 # Copyright (C) 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., 59 Temple Place - Suite 330, Boston, MA
17 # 02111-1307, USA.
18
19 AT_BANNER([[Conflicts.]])
20
21
22 ## ---------------- ##
23 ## S/R in initial. ##
24 ## ---------------- ##
25
26 # I once hacked Bison in such a way that it lost its reductions on the
27 # initial state (because it was confusing it with the last state). It
28 # took me a while to strip down my failures to this simple case. So
29 # make sure it finds the s/r conflict below.
30
31 AT_SETUP([S/R in initial])
32
33 AT_DATA([[input.y]],
34 [[%expect 1
35 %%
36 exp: e 'e';
37 e: 'e' | /* Nothing. */;
38 ]])
39
40 AT_CHECK([bison input.y -o input.c])
41
42 AT_CLEANUP
43
44 ## ------------------- ##
45 ## %nonassoc and eof. ##
46 ## ------------------- ##
47
48 AT_SETUP([%nonassoc and eof])
49
50 AT_DATA([input.y],
51 [[
52 %{
53 #include <config.h>
54 /* We don't need a perfect malloc for these tests. */
55 #undef malloc
56 #include <stdio.h>
57
58 #if STDC_HEADERS
59 # include <stdlib.h>
60 #endif
61
62 #define YYERROR_VERBOSE 1
63 static void
64 yyerror (const char *msg)
65 {
66 fprintf (stderr, "%s\n", msg);
67 exit (1);
68 }
69
70 /* The current argument. */
71 static const char *input = NULL;
72
73 static int
74 yylex (void)
75 {
76 /* No token stands for end of file. */
77 if (input && *input)
78 return *input++;
79 else
80 return 0;
81 }
82
83 %}
84
85 %nonassoc '<' '>'
86
87 %%
88 expr: expr '<' expr
89 | expr '>' expr
90 | '0'
91 ;
92 %%
93 int
94 main (int argc, const char *argv[])
95 {
96 if (argc > 1)
97 input = argv[1];
98 return yyparse ();
99 }
100 ]])
101
102 # Specify the output files to avoid problems on different file systems.
103 AT_CHECK([bison input.y -o input.c])
104 AT_CHECK([$CC $CFLAGS $CPPFLAGS input.c -o input], 0, [], [ignore])
105
106 AT_CHECK([./input '0<0'])
107 # FIXME: This is an actual bug, but a new one, in the sense that
108 # no one has ever spotted it! The messages are *wrong*: there should
109 # be nothing there, it should be expected eof.
110 AT_CHECK([./input '0<0<0'], [1], [],
111 [parse error, unexpected '<', expecting '<' or '>'
112 ])
113
114 AT_CHECK([./input '0>0'])
115 AT_CHECK([./input '0>0>0'], [1], [],
116 [parse error, unexpected '>', expecting '<' or '>'
117 ])
118
119 AT_CHECK([./input '0<0>0'], [1], [],
120 [parse error, unexpected '>', expecting '<' or '>'
121 ])
122
123 AT_CLEANUP
124
125
126
127 ## ------------------------- ##
128 ## Unresolved SR Conflicts. ##
129 ## ------------------------- ##
130
131 AT_SETUP([Unresolved SR Conflicts])
132
133 AT_KEYWORDS([report])
134
135 AT_DATA([input.y],
136 [[%token NUM OP
137 %%
138 exp: exp OP exp | NUM;
139 ]])
140
141 AT_CHECK([bison input.y -o input.c --report=all], 0, [],
142 [input.y contains 1 shift/reduce conflict.
143 ])
144
145 # Check the contents of the report.
146 AT_CHECK([cat input.output], [],
147 [[State 5 contains 1 shift/reduce conflict.
148
149
150 Grammar
151
152 0 $axiom: exp $
153
154 1 exp: exp OP exp
155 2 | NUM
156
157
158 Terminals, with rules where they appear
159
160 $ (0) 0
161 error (256)
162 NUM (258) 2
163 OP (259) 1
164
165
166 Nonterminals, with rules where they appear
167
168 $axiom (5)
169 on left: 0
170 exp (6)
171 on left: 1 2, on right: 0 1
172
173
174 state 0
175
176 $axiom -> . exp $ (rule 0)
177 exp -> . exp OP exp (rule 1)
178 exp -> . NUM (rule 2)
179
180 NUM shift, and go to state 1
181
182 exp go to state 2
183
184
185
186 state 1
187
188 exp -> NUM . (rule 2)
189
190 $default reduce using rule 2 (exp)
191
192
193
194 state 2
195
196 $axiom -> exp . $ (rule 0)
197 exp -> exp . OP exp (rule 1)
198
199 $ shift, and go to state 3
200 OP shift, and go to state 4
201
202
203
204 state 3
205
206 $axiom -> exp $ . (rule 0)
207
208 $default accept
209
210
211 state 4
212
213 exp -> . exp OP exp (rule 1)
214 exp -> exp OP . exp (rule 1)
215 exp -> . NUM (rule 2)
216
217 NUM shift, and go to state 1
218
219 exp go to state 5
220
221
222
223 state 5
224
225 exp -> exp . OP exp [$, OP] (rule 1)
226 exp -> exp OP exp . [$, OP] (rule 1)
227
228 OP shift, and go to state 4
229
230 OP [reduce using rule 1 (exp)]
231 $default reduce using rule 1 (exp)
232
233
234
235 ]])
236
237 AT_CLEANUP
238
239
240 ## --------------------- ##
241 ## Solved SR Conflicts. ##
242 ## --------------------- ##
243
244 AT_SETUP([Solved SR Conflicts])
245
246 AT_KEYWORDS([report])
247
248 AT_DATA([input.y],
249 [[%token NUM OP
250 %right OP
251 %%
252 exp: exp OP exp | NUM;
253 ]])
254
255 AT_CHECK([bison input.y -o input.c --report=all], 0, [], [])
256
257 # Check the contents of the report.
258 AT_CHECK([cat input.output], [],
259 [[Grammar
260
261 0 $axiom: exp $
262
263 1 exp: exp OP exp
264 2 | NUM
265
266
267 Terminals, with rules where they appear
268
269 $ (0) 0
270 error (256)
271 NUM (258) 2
272 OP (259) 1
273
274
275 Nonterminals, with rules where they appear
276
277 $axiom (5)
278 on left: 0
279 exp (6)
280 on left: 1 2, on right: 0 1
281
282
283 state 0
284
285 $axiom -> . exp $ (rule 0)
286 exp -> . exp OP exp (rule 1)
287 exp -> . NUM (rule 2)
288
289 NUM shift, and go to state 1
290
291 exp go to state 2
292
293
294
295 state 1
296
297 exp -> NUM . (rule 2)
298
299 $default reduce using rule 2 (exp)
300
301
302
303 state 2
304
305 $axiom -> exp . $ (rule 0)
306 exp -> exp . OP exp (rule 1)
307
308 $ shift, and go to state 3
309 OP shift, and go to state 4
310
311
312
313 state 3
314
315 $axiom -> exp $ . (rule 0)
316
317 $default accept
318
319
320 state 4
321
322 exp -> . exp OP exp (rule 1)
323 exp -> exp OP . exp (rule 1)
324 exp -> . NUM (rule 2)
325
326 NUM shift, and go to state 1
327
328 exp go to state 5
329
330
331
332 state 5
333
334 exp -> exp . OP exp [$] (rule 1)
335 exp -> exp OP exp . [$] (rule 1)
336
337 OP shift, and go to state 4
338
339 $default reduce using rule 1 (exp)
340
341 Conflict between rule 2 and token OP resolved as reduce (%right OP).
342
343
344 ]])
345
346 AT_CLEANUP
347
348
349
350
351 ## -------------------- ##
352 ## %expect not enough. ##
353 ## -------------------- ##
354
355 AT_SETUP([%expect not enough])
356
357 AT_DATA([input.y],
358 [[%token NUM OP
359 %expect 0
360 %%
361 exp: exp OP exp | NUM;
362 ]])
363
364 AT_CHECK([bison input.y -o input.c], 1, [],
365 [input.y contains 1 shift/reduce conflict.
366 expected 0 shift/reduce conflicts
367 ])
368 AT_CLEANUP
369
370
371 ## --------------- ##
372 ## %expect right. ##
373 ## --------------- ##
374
375 AT_SETUP([%expect right])
376
377 AT_DATA([input.y],
378 [[%token NUM OP
379 %expect 1
380 %%
381 exp: exp OP exp | NUM;
382 ]])
383
384 AT_CHECK([bison input.y -o input.c], 0)
385 AT_CLEANUP
386
387
388 ## ------------------ ##
389 ## %expect too much. ##
390 ## ------------------ ##
391
392 AT_SETUP([%expect too much])
393
394 AT_DATA([input.y],
395 [[%token NUM OP
396 %expect 2
397 %%
398 exp: exp OP exp | NUM;
399 ]])
400
401 AT_CHECK([bison input.y -o input.c], 1, [],
402 [input.y contains 1 shift/reduce conflict.
403 expected 2 shift/reduce conflicts
404 ])
405 AT_CLEANUP