]> git.saurik.com Git - bison.git/blob - tests/regression.at
* src/LR0.c (augment_automaton): Call `insert_eof_shifting_state'
[bison.git] / tests / regression.at
1 # Bison Regressions. -*- 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
19 AT_BANNER([[Regression tests.]])
20
21 ## ------------------ ##
22 ## Duplicate string. ##
23 ## ------------------ ##
24
25
26 AT_SETUP([Duplicate string])
27
28 AT_DATA([duplicate.y],
29 [[/* `Bison -v' used to dump core when two tokens are defined with the same
30 string, as LE and GE below. */
31
32 %token NUM
33 %token LE "<="
34 %token GE "<="
35
36 %%
37 exp: '(' exp ')' | NUM ;
38 %%
39 ]])
40
41 AT_CHECK([bison -v duplicate.y -o duplicate.c], 0, ignore, ignore)
42
43 AT_CLEANUP
44
45
46 ## ------------------------- ##
47 ## Unresolved SR Conflicts. ##
48 ## ------------------------- ##
49
50 AT_SETUP([Unresolved SR Conflicts])
51
52 AT_DATA([input.y],
53 [[%token NUM OP
54 %%
55 exp: exp OP exp | NUM;
56 ]])
57
58 AT_CHECK([bison input.y -o input.c -v], 0, [],
59 [input.y contains 1 shift/reduce conflict.
60 ])
61
62 # Check the contents of the report.
63 AT_CHECK([cat input.output], [],
64 [[State 4 contains 1 shift/reduce conflict.
65
66
67 Grammar
68
69 Number, Line, Rule
70 1 3 exp -> exp OP exp
71 2 3 exp -> NUM
72
73
74 Terminals, with rules where they appear
75
76 $ (-1)
77 error (256)
78 NUM (257) 2
79 OP (258) 1
80
81
82 Nonterminals, with rules where they appear
83
84 exp (5)
85 on left: 1 2, on right: 1
86
87
88 state 0
89
90 NUM shift, and go to state 1
91
92 exp go to state 2
93
94
95
96 state 1
97
98 exp -> NUM . (rule 2)
99
100 $default reduce using rule 2 (exp)
101
102
103
104 state 2
105
106 exp -> exp . OP exp (rule 1)
107
108 $ go to state 5
109 OP shift, and go to state 3
110
111
112
113 state 3
114
115 exp -> exp OP . exp (rule 1)
116
117 NUM shift, and go to state 1
118
119 exp go to state 4
120
121
122
123 state 4
124
125 exp -> exp . OP exp (rule 1)
126 exp -> exp OP exp . (rule 1)
127
128 OP shift, and go to state 3
129
130 OP [reduce using rule 1 (exp)]
131 $default reduce using rule 1 (exp)
132
133
134
135 state 5
136
137 $ go to state 6
138
139
140
141 state 6
142
143 $default accept
144
145
146 ]])
147
148 AT_CLEANUP
149
150
151 ## --------------------- ##
152 ## Solved SR Conflicts. ##
153 ## --------------------- ##
154
155 AT_SETUP([Solved SR Conflicts])
156
157 AT_DATA([input.y],
158 [[%token NUM OP
159 %right OP
160 %%
161 exp: exp OP exp | NUM;
162 ]])
163
164 AT_CHECK([bison input.y -o input.c -v], 0, [], [])
165
166 # Check the contents of the report.
167 AT_CHECK([cat input.output], [],
168 [[Conflict in state 4 between rule 1 and token OP resolved as shift.
169
170
171 Grammar
172
173 Number, Line, Rule
174 1 4 exp -> exp OP exp
175 2 4 exp -> NUM
176
177
178 Terminals, with rules where they appear
179
180 $ (-1)
181 error (256)
182 NUM (257) 2
183 OP (258) 1
184
185
186 Nonterminals, with rules where they appear
187
188 exp (5)
189 on left: 1 2, on right: 1
190
191
192 state 0
193
194 NUM shift, and go to state 1
195
196 exp go to state 2
197
198
199
200 state 1
201
202 exp -> NUM . (rule 2)
203
204 $default reduce using rule 2 (exp)
205
206
207
208 state 2
209
210 exp -> exp . OP exp (rule 1)
211
212 $ go to state 5
213 OP shift, and go to state 3
214
215
216
217 state 3
218
219 exp -> exp OP . exp (rule 1)
220
221 NUM shift, and go to state 1
222
223 exp go to state 4
224
225
226
227 state 4
228
229 exp -> exp . OP exp (rule 1)
230 exp -> exp OP exp . (rule 1)
231
232 OP shift, and go to state 3
233
234 $default reduce using rule 1 (exp)
235
236
237
238 state 5
239
240 $ go to state 6
241
242
243
244 state 6
245
246 $default accept
247
248
249 ]])
250
251 AT_CLEANUP
252
253
254
255
256 ## ------------------- ##
257 ## Rule Line Numbers. ##
258 ## ------------------- ##
259
260 AT_SETUP([Rule Line Numbers])
261
262 AT_DATA([input.y],
263 [[%%
264 expr:
265 'a'
266
267 {
268
269 }
270
271 'b'
272
273 {
274
275 }
276
277 |
278
279
280 {
281
282
283 }
284
285 'c'
286
287 {
288
289 }
290 ]])
291
292 AT_CHECK([bison input.y -o input.c -v], 0, [], [])
293
294 # Check the contents of the report.
295 AT_CHECK([cat input.output], [],
296 [[Grammar
297
298 Number, Line, Rule
299 1 2 @1 -> /* empty */
300 2 2 expr -> 'a' @1 'b'
301 3 15 @2 -> /* empty */
302 4 15 expr -> @2 'c'
303
304
305 Terminals, with rules where they appear
306
307 $ (-1)
308 'a' (97) 2
309 'b' (98) 2
310 'c' (99) 4
311 error (256)
312
313
314 Nonterminals, with rules where they appear
315
316 expr (6)
317 on left: 2 4
318 @1 (7)
319 on left: 1, on right: 2
320 @2 (8)
321 on left: 3, on right: 4
322
323
324 state 0
325
326 'a' shift, and go to state 1
327
328 $default reduce using rule 3 (@2)
329
330 expr go to state 6
331 @2 go to state 2
332
333
334
335 state 1
336
337 expr -> 'a' . @1 'b' (rule 2)
338
339 $default reduce using rule 1 (@1)
340
341 @1 go to state 3
342
343
344
345 state 2
346
347 expr -> @2 . 'c' (rule 4)
348
349 'c' shift, and go to state 4
350
351
352
353 state 3
354
355 expr -> 'a' @1 . 'b' (rule 2)
356
357 'b' shift, and go to state 5
358
359
360
361 state 4
362
363 expr -> @2 'c' . (rule 4)
364
365 $default reduce using rule 4 (expr)
366
367
368
369 state 5
370
371 expr -> 'a' @1 'b' . (rule 2)
372
373 $default reduce using rule 2 (expr)
374
375
376
377 state 6
378
379 $ go to state 7
380
381
382
383 state 7
384
385 $default accept
386
387
388 ]])
389
390 AT_CLEANUP
391
392
393
394 ## -------------------- ##
395 ## %expect not enough. ##
396 ## -------------------- ##
397
398 AT_SETUP([%expect not enough])
399
400 AT_DATA([input.y],
401 [[%token NUM OP
402 %expect 0
403 %%
404 exp: exp OP exp | NUM;
405 ]])
406
407 AT_CHECK([bison input.y -o input.c], 1, [],
408 [input.y contains 1 shift/reduce conflict.
409 expected 0 shift/reduce conflicts
410 ])
411 AT_CLEANUP
412
413
414 ## --------------- ##
415 ## %expect right. ##
416 ## --------------- ##
417
418 AT_SETUP([%expect right])
419
420 AT_DATA([input.y],
421 [[%token NUM OP
422 %expect 1
423 %%
424 exp: exp OP exp | NUM;
425 ]])
426
427 AT_CHECK([bison input.y -o input.c], 0)
428 AT_CLEANUP
429
430
431 ## ------------------ ##
432 ## %expect too much. ##
433 ## ------------------ ##
434
435 AT_SETUP([%expect too much])
436
437 AT_DATA([input.y],
438 [[%token NUM OP
439 %expect 2
440 %%
441 exp: exp OP exp | NUM;
442 ]])
443
444 AT_CHECK([bison input.y -o input.c], 1, [],
445 [input.y contains 1 shift/reduce conflict.
446 expected 2 shift/reduce conflicts
447 ])
448 AT_CLEANUP
449
450
451 ## ---------------------- ##
452 ## Mixing %token styles. ##
453 ## ---------------------- ##
454
455
456 AT_SETUP([Mixing %token styles])
457
458 # Taken from the documentation.
459 AT_DATA([input.y],
460 [[%token <operator> OR "||"
461 %token <operator> LE 134 "<="
462 %left OR "<="
463 %%
464 exp: ;
465 %%
466 ]])
467
468 AT_CHECK([bison -v input.y -o input.c], 0, ignore, ignore)
469
470 AT_CLEANUP
471
472
473
474 ## ---------------------- ##
475 ## %union and --defines. ##
476 ## ---------------------- ##
477
478
479 AT_SETUP([%union and --defines])
480
481 AT_DATA([union.y],
482 [%union
483 {
484 int integer;
485 char *string ;
486 }
487 %%
488 exp: {};
489 ])
490
491 AT_CHECK([bison --defines union.y])
492
493 AT_CLEANUP
494
495
496 ## --------------------------------------- ##
497 ## Duplicate '/' in C comments in %union ##
498 ## --------------------------------------- ##
499
500
501 AT_SETUP([%union and C comments])
502
503 AT_DATA([union-comment.y],
504 [%union
505 {
506 /* The int. */ int integer;
507 /* The string. */ char *string ;
508 }
509 %%
510 exp: {};
511 ])
512
513 AT_CHECK([bison union-comment.y])
514 AT_CHECK([fgrep '//*' union-comment.tab.c], [1], [])
515
516 AT_CLEANUP
517
518
519 ## ----------------- ##
520 ## Invalid input 1. ##
521 ## ----------------- ##
522
523
524 AT_SETUP([Invalid input: 1])
525
526 AT_DATA([input.y],
527 [[%%
528 ?
529 ]])
530
531 AT_CHECK([bison input.y], [1], [],
532 [[input.y:2: invalid input: `?'
533 input.y:3: fatal error: no rules in the input grammar
534 ]])
535
536 AT_CLEANUP
537
538
539 ## ----------------- ##
540 ## Invalid input 2. ##
541 ## ----------------- ##
542
543
544 AT_SETUP([Invalid input: 2])
545
546 AT_DATA([input.y],
547 [[%%
548 default: 'a' }
549 ]])
550
551 AT_CHECK([bison input.y], [1], [],
552 [[input.y:2: invalid input: `}'
553 ]])
554
555 AT_CLEANUP
556
557
558
559 ## -------------------- ##
560 ## Invalid %directive. ##
561 ## -------------------- ##
562
563
564 AT_SETUP([Invalid %directive])
565
566 AT_DATA([input.y],
567 [[%invalid
568 ]])
569
570 AT_CHECK([bison input.y], [1], [],
571 [[input.y:1: unrecognized: %invalid
572 input.y:1: Skipping to next %
573 input.y:2: fatal error: no input grammar
574 ]])
575
576 AT_CLEANUP
577
578
579
580 ## --------------------- ##
581 ## Invalid CPP headers. ##
582 ## --------------------- ##
583
584 # AT_TEST_CPP_GUARD_H([INPUT-FILE-BASE)
585 # -------------------------------------
586 m4_define([AT_TEST_CPP_GUARD_H],
587 [AT_SETUP([Invalid CPP guards: $1])
588
589 # Possibly create inner directories.
590 dirname=`AS_DIRNAME([$1])`
591 AS_MKDIR_P([$dirname])
592
593 AT_DATA([$1.y],
594 [%%
595 dummy:
596 ])
597
598 AT_CHECK([bison --defines=$1.h $1.y])
599
600 # CPP should be happy with it.
601 AT_CHECK([$CC -E $1.h], 0, [ignore])
602
603 AT_CLEANUP
604 ])
605
606 AT_TEST_CPP_GUARD_H([input/input])
607 AT_TEST_CPP_GUARD_H([9foo])
608
609
610 ## ---------------- ##
611 ## Broken Closure. ##
612 ## ---------------- ##
613
614 # TC was once broken during a massive `simplification' of the code.
615 # It resulted in bison dumping core on the following grammar (the
616 # computation of FIRSTS uses TC). It managed to produce a pretty
617 # exotic closure:
618 #
619 # TC: Input
620 #
621 # 01234567
622 # +--------+
623 # 0| 1 |
624 # 1| 1 |
625 # 2| 1 |
626 # 3| 1 |
627 # 4| 1 |
628 # 5| 1 |
629 # 6| 1|
630 # 7| |
631 # +--------+
632 #
633 # TC: Output
634 #
635 # 01234567
636 # +--------+
637 # 0| 1 |
638 # 1| 111 |
639 # 2| 111 |
640 # 3| 1111 |
641 # 4| 111 1 |
642 # 5| 111 1 |
643 # 6| 111 1|
644 # 7| 111 |
645 # +--------+
646 #
647 # instead of that below.
648
649 AT_SETUP([Broken Closure])
650
651 AT_DATA([input.y],
652 [[%%
653 a: b
654 b: c
655 c: d
656 d: e
657 e: f
658 f: g
659 g: h
660 h: 'h'
661 ]])
662
663 AT_CHECK([bison --trace input.y 2>&1 |
664 sed -n '/^TC: Output BEGIN/,/^TC: Output END/p'],
665 [0],
666 [[TC: Output BEGIN
667 @&t@
668 01234567
669 +--------+
670 0| 1111111|
671 1| 111111|
672 2| 11111|
673 3| 1111|
674 4| 111|
675 5| 11|
676 6| 1|
677 7| |
678 +--------+
679 TC: Output END
680 ]])
681
682 AT_CLEANUP