]> git.saurik.com Git - bison.git/blob - tests/regression.at
2f10d0668ea1a9fa281be2b03e962da1e419da11
[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 $ shift, and 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 $ shift, and 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 $ shift, and 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 $ shift, and 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 $ shift, and 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 ## ------- ##
612 ## Web2c. ##
613 ## ------- ##
614
615 # The generation of the reduction was once wrong in Bison, and made it
616 # miss some reductions. In the following test case, the reduction on
617 # `undef_id_tok' in state 1 was missing. This is stripped down from
618 # the actual web2c.y.
619
620 AT_SETUP([Web2c])
621
622 AT_DATA([input.y],
623 [[%token undef_id_tok const_id_tok
624
625 %start CONST_DEC_PART
626 \f
627 %%
628 CONST_DEC_PART:
629 CONST_DEC_LIST
630 ;
631
632 CONST_DEC_LIST:
633 CONST_DEC
634 | CONST_DEC_LIST CONST_DEC
635 ;
636
637 CONST_DEC:
638 { } undef_id_tok '=' const_id_tok ';'
639 ;
640 %%
641
642 ]])
643
644 AT_CHECK([bison -v input.y])
645
646 AT_CHECK([sed -n 's/ *$//;/^$/!p' input.output], 0,
647 [[Grammar
648 Number, Line, Rule
649 1 6 CONST_DEC_PART -> CONST_DEC_LIST
650 2 10 CONST_DEC_LIST -> CONST_DEC
651 3 12 CONST_DEC_LIST -> CONST_DEC_LIST CONST_DEC
652 4 15 @1 -> /* empty */
653 5 15 CONST_DEC -> @1 undef_id_tok '=' const_id_tok ';'
654 Terminals, with rules where they appear
655 $ (-1)
656 ';' (59) 5
657 '=' (61) 5
658 error (256)
659 undef_id_tok (257) 5
660 const_id_tok (258) 5
661 Nonterminals, with rules where they appear
662 CONST_DEC_PART (7)
663 on left: 1
664 CONST_DEC_LIST (8)
665 on left: 2 3, on right: 1 3
666 CONST_DEC (9)
667 on left: 5, on right: 2 3
668 @1 (10)
669 on left: 4, on right: 5
670 state 0
671 $default reduce using rule 4 (@1)
672 CONST_DEC_PART go to state 9
673 CONST_DEC_LIST go to state 1
674 CONST_DEC go to state 2
675 @1 go to state 3
676 state 1
677 CONST_DEC_PART -> CONST_DEC_LIST . (rule 1)
678 CONST_DEC_LIST -> CONST_DEC_LIST . CONST_DEC (rule 3)
679 undef_id_tok reduce using rule 4 (@1)
680 $default reduce using rule 1 (CONST_DEC_PART)
681 CONST_DEC go to state 4
682 @1 go to state 3
683 state 2
684 CONST_DEC_LIST -> CONST_DEC . (rule 2)
685 $default reduce using rule 2 (CONST_DEC_LIST)
686 state 3
687 CONST_DEC -> @1 . undef_id_tok '=' const_id_tok ';' (rule 5)
688 undef_id_tok shift, and go to state 5
689 state 4
690 CONST_DEC_LIST -> CONST_DEC_LIST CONST_DEC . (rule 3)
691 $default reduce using rule 3 (CONST_DEC_LIST)
692 state 5
693 CONST_DEC -> @1 undef_id_tok . '=' const_id_tok ';' (rule 5)
694 '=' shift, and go to state 6
695 state 6
696 CONST_DEC -> @1 undef_id_tok '=' . const_id_tok ';' (rule 5)
697 const_id_tok shift, and go to state 7
698 state 7
699 CONST_DEC -> @1 undef_id_tok '=' const_id_tok . ';' (rule 5)
700 ';' shift, and go to state 8
701 state 8
702 CONST_DEC -> @1 undef_id_tok '=' const_id_tok ';' . (rule 5)
703 $default reduce using rule 5 (CONST_DEC)
704 state 9
705 $ shift, and go to state 10
706 state 10
707 $default accept
708 ]])
709
710 AT_CLEANUP