]> git.saurik.com Git - bison.git/blame - tests/regression.at
* src/output.c (header_output): Don't forget to export YYLTYPE and
[bison.git] / tests / regression.at
CommitLineData
342b8b6e
AD
1# Bison Regressions. -*- Autotest -*-
2# Copyright 2001 Free Software Foundation, Inc.
c95f2d78 3
342b8b6e
AD
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.
c95f2d78 8
342b8b6e
AD
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.
c95f2d78 13
342b8b6e
AD
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.
c95f2d78 18
342b8b6e 19AT_BANNER([[Regression tests.]])
c95f2d78
AD
20
21## ------------------ ##
22## Duplicate string. ##
23## ------------------ ##
24
25
26AT_SETUP([Duplicate string])
27
f499b062 28AT_DATA([input.y],
c95f2d78
AD
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%%
37exp: '(' exp ')' | NUM ;
38%%
39]])
40
f499b062 41AT_CHECK([bison -v input.y -o input.c], 0, ignore, ignore)
c95f2d78 42
d803322e 43AT_CLEANUP
c95f2d78
AD
44
45
ba9dda1a
AD
46## ------------------------- ##
47## Unresolved SR Conflicts. ##
48## ------------------------- ##
0df87bb6 49
ba9dda1a 50AT_SETUP([Unresolved SR Conflicts])
0df87bb6
AD
51
52AT_DATA([input.y],
53[[%token NUM OP
54%%
55exp: exp OP exp | NUM;
56]])
57
58AT_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.
63AT_CHECK([cat input.output], [],
b365aa05 64[[State 5 contains 1 shift/reduce conflict.
0df87bb6 65
d2d1b42b 66
0df87bb6
AD
67Grammar
68
b29b2ed5 69 Number, Line, Rule
ff442794 70 0 3 $axiom -> exp $
b29b2ed5
AD
71 1 3 exp -> exp OP exp
72 2 3 exp -> NUM
0df87bb6 73
d2d1b42b 74
0df87bb6
AD
75Terminals, with rules where they appear
76
b365aa05 77$ (0) 0
0df87bb6
AD
78error (256)
79NUM (257) 2
80OP (258) 1
81
d2d1b42b 82
0df87bb6
AD
83Nonterminals, with rules where they appear
84
b365aa05
AD
85$axiom (5)
86 on left: 0
87exp (6)
88 on left: 1 2, on right: 0 1
0df87bb6
AD
89
90
91state 0
92
93 NUM shift, and go to state 1
94
95 exp go to state 2
96
97
98
99state 1
100
101 exp -> NUM . (rule 2)
102
103 $default reduce using rule 2 (exp)
104
105
106
107state 2
108
b365aa05 109 $axiom -> exp . $ (rule 0)
0df87bb6
AD
110 exp -> exp . OP exp (rule 1)
111
b365aa05
AD
112 $ shift, and go to state 3
113 OP shift, and go to state 4
0df87bb6
AD
114
115
116
117state 3
118
b365aa05 119 $axiom -> exp $ . (rule 0)
0df87bb6 120
b365aa05 121 $default accept
0df87bb6
AD
122
123
124state 4
125
b365aa05 126 exp -> exp OP . exp (rule 1)
0df87bb6 127
b365aa05 128 NUM shift, and go to state 1
0df87bb6 129
b365aa05 130 exp go to state 5
c73a41af 131
0df87bb6
AD
132
133
134state 5
135
b365aa05
AD
136 exp -> exp . OP exp (rule 1)
137 exp -> exp OP exp . (rule 1)
0df87bb6 138
b365aa05 139 OP shift, and go to state 4
0df87bb6 140
b365aa05
AD
141 OP [reduce using rule 1 (exp)]
142 $default reduce using rule 1 (exp)
ba9dda1a 143
d2d1b42b
AD
144
145
ba9dda1a
AD
146]])
147
d803322e 148AT_CLEANUP
ba9dda1a
AD
149
150
151## --------------------- ##
152## Solved SR Conflicts. ##
153## --------------------- ##
154
155AT_SETUP([Solved SR Conflicts])
156
157AT_DATA([input.y],
158[[%token NUM OP
159%right OP
160%%
161exp: exp OP exp | NUM;
162]])
163
164AT_CHECK([bison input.y -o input.c -v], 0, [], [])
165
166# Check the contents of the report.
167AT_CHECK([cat input.output], [],
b365aa05 168[[Conflict in state 5 between rule 2 and token OP resolved as shift.
ba9dda1a 169
d2d1b42b 170
ba9dda1a
AD
171Grammar
172
b29b2ed5 173 Number, Line, Rule
ff442794 174 0 4 $axiom -> exp $
b29b2ed5
AD
175 1 4 exp -> exp OP exp
176 2 4 exp -> NUM
ba9dda1a 177
d2d1b42b 178
ba9dda1a
AD
179Terminals, with rules where they appear
180
b365aa05 181$ (0) 0
ba9dda1a
AD
182error (256)
183NUM (257) 2
184OP (258) 1
185
d2d1b42b 186
ba9dda1a
AD
187Nonterminals, with rules where they appear
188
b365aa05
AD
189$axiom (5)
190 on left: 0
191exp (6)
192 on left: 1 2, on right: 0 1
ba9dda1a
AD
193
194
195state 0
196
197 NUM shift, and go to state 1
198
199 exp go to state 2
200
201
202
203state 1
204
205 exp -> NUM . (rule 2)
206
207 $default reduce using rule 2 (exp)
208
209
210
211state 2
212
b365aa05 213 $axiom -> exp . $ (rule 0)
ba9dda1a
AD
214 exp -> exp . OP exp (rule 1)
215
b365aa05
AD
216 $ shift, and go to state 3
217 OP shift, and go to state 4
ba9dda1a
AD
218
219
220
221state 3
222
b365aa05 223 $axiom -> exp $ . (rule 0)
ba9dda1a 224
b365aa05 225 $default accept
ba9dda1a
AD
226
227
228state 4
229
b365aa05 230 exp -> exp OP . exp (rule 1)
ba9dda1a 231
b365aa05 232 NUM shift, and go to state 1
ba9dda1a 233
b365aa05 234 exp go to state 5
ba9dda1a
AD
235
236
237
238state 5
239
b365aa05
AD
240 exp -> exp . OP exp (rule 1)
241 exp -> exp OP exp . (rule 1)
ba9dda1a 242
b365aa05 243 OP shift, and go to state 4
ba9dda1a 244
b365aa05 245 $default reduce using rule 1 (exp)
0df87bb6 246
d2d1b42b
AD
247
248
0df87bb6
AD
249]])
250
d803322e 251AT_CLEANUP
0df87bb6 252
c95f2d78 253
7da99ede 254
2ca209c1
AD
255
256## ------------------- ##
257## Rule Line Numbers. ##
258## ------------------- ##
259
260AT_SETUP([Rule Line Numbers])
261
262AT_DATA([input.y],
263[[%%
264expr:
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
292AT_CHECK([bison input.y -o input.c -v], 0, [], [])
293
294# Check the contents of the report.
295AT_CHECK([cat input.output], [],
d2d1b42b 296[[Grammar
2ca209c1
AD
297
298 Number, Line, Rule
ff442794 299 0 2 $axiom -> expr $
2ca209c1
AD
300 1 2 @1 -> /* empty */
301 2 2 expr -> 'a' @1 'b'
302 3 15 @2 -> /* empty */
303 4 15 expr -> @2 'c'
304
d2d1b42b 305
2ca209c1
AD
306Terminals, with rules where they appear
307
b365aa05 308$ (0) 0
2ca209c1
AD
309'a' (97) 2
310'b' (98) 2
311'c' (99) 4
312error (256)
313
d2d1b42b 314
2ca209c1
AD
315Nonterminals, with rules where they appear
316
b365aa05
AD
317$axiom (6)
318 on left: 0
319expr (7)
320 on left: 2 4, on right: 0
321@1 (8)
2ca209c1 322 on left: 1, on right: 2
b365aa05 323@2 (9)
2ca209c1
AD
324 on left: 3, on right: 4
325
326
327state 0
328
329 'a' shift, and go to state 1
330
610ab194
AD
331 $default reduce using rule 3 (@2)
332
b365aa05
AD
333 expr go to state 2
334 @2 go to state 3
2ca209c1
AD
335
336
337
338state 1
339
340 expr -> 'a' . @1 'b' (rule 2)
341
342 $default reduce using rule 1 (@1)
343
b365aa05 344 @1 go to state 4
2ca209c1
AD
345
346
347
348state 2
349
b365aa05 350 $axiom -> expr . $ (rule 0)
2ca209c1 351
b365aa05 352 $ shift, and go to state 5
2ca209c1
AD
353
354
355
356state 3
357
b365aa05 358 expr -> @2 . 'c' (rule 4)
2ca209c1 359
b365aa05 360 'c' shift, and go to state 6
2ca209c1
AD
361
362
363
364state 4
365
b365aa05 366 expr -> 'a' @1 . 'b' (rule 2)
2ca209c1 367
b365aa05 368 'b' shift, and go to state 7
2ca209c1
AD
369
370
371
372state 5
373
b365aa05 374 $axiom -> expr $ . (rule 0)
2ca209c1 375
b365aa05 376 $default accept
2ca209c1
AD
377
378
379state 6
380
b365aa05
AD
381 expr -> @2 'c' . (rule 4)
382
383 $default reduce using rule 4 (expr)
2ca209c1
AD
384
385
386
387state 7
388
b365aa05
AD
389 expr -> 'a' @1 'b' . (rule 2)
390
391 $default reduce using rule 2 (expr)
392
d2d1b42b
AD
393
394
2ca209c1
AD
395]])
396
397AT_CLEANUP
398
399
400
7da99ede
AD
401## -------------------- ##
402## %expect not enough. ##
403## -------------------- ##
404
405AT_SETUP([%expect not enough])
406
407AT_DATA([input.y],
408[[%token NUM OP
409%expect 0
410%%
411exp: exp OP exp | NUM;
412]])
413
414AT_CHECK([bison input.y -o input.c], 1, [],
415[input.y contains 1 shift/reduce conflict.
416expected 0 shift/reduce conflicts
417])
d803322e 418AT_CLEANUP
7da99ede
AD
419
420
421## --------------- ##
422## %expect right. ##
423## --------------- ##
424
425AT_SETUP([%expect right])
426
427AT_DATA([input.y],
428[[%token NUM OP
429%expect 1
430%%
431exp: exp OP exp | NUM;
432]])
433
a034c8b8 434AT_CHECK([bison input.y -o input.c], 0)
d803322e 435AT_CLEANUP
7da99ede
AD
436
437
438## ------------------ ##
439## %expect too much. ##
440## ------------------ ##
441
442AT_SETUP([%expect too much])
443
444AT_DATA([input.y],
445[[%token NUM OP
446%expect 2
447%%
448exp: exp OP exp | NUM;
449]])
450
451AT_CHECK([bison input.y -o input.c], 1, [],
452[input.y contains 1 shift/reduce conflict.
453expected 2 shift/reduce conflicts
454])
d803322e 455AT_CLEANUP
7da99ede
AD
456
457
cd5aafcf
AD
458## ---------------------- ##
459## Mixing %token styles. ##
460## ---------------------- ##
461
462
463AT_SETUP([Mixing %token styles])
464
465# Taken from the documentation.
466AT_DATA([input.y],
467[[%token <operator> OR "||"
468%token <operator> LE 134 "<="
469%left OR "<="
470%%
471exp: ;
472%%
473]])
474
475AT_CHECK([bison -v input.y -o input.c], 0, ignore, ignore)
476
d803322e 477AT_CLEANUP
cd5aafcf
AD
478
479
480
561f9a30
AD
481## ----------------- ##
482## Invalid input 1. ##
483## ----------------- ##
484
485
486AT_SETUP([Invalid input: 1])
487
488AT_DATA([input.y],
489[[%%
490?
491]])
492
493AT_CHECK([bison input.y], [1], [],
e0c40012 494[[input.y:2: invalid input: `?'
561f9a30 495input.y:3: fatal error: no rules in the input grammar
e0c40012 496]])
561f9a30
AD
497
498AT_CLEANUP
499
500
501## ----------------- ##
502## Invalid input 2. ##
503## ----------------- ##
504
505
506AT_SETUP([Invalid input: 2])
507
508AT_DATA([input.y],
509[[%%
510default: 'a' }
511]])
512
513AT_CHECK([bison input.y], [1], [],
e0c40012
AD
514[[input.y:2: invalid input: `}'
515]])
516
517AT_CLEANUP
518
519
520
521## -------------------- ##
522## Invalid %directive. ##
523## -------------------- ##
524
525
526AT_SETUP([Invalid %directive])
527
528AT_DATA([input.y],
529[[%invalid
530]])
531
532AT_CHECK([bison input.y], [1], [],
533[[input.y:1: unrecognized: %invalid
534input.y:1: Skipping to next %
535input.y:2: fatal error: no input grammar
536]])
561f9a30
AD
537
538AT_CLEANUP
539
540
270a173c 541
b9752825
AD
542## -------------- ##
543## Web2c Report. ##
544## -------------- ##
776209d6
AD
545
546# The generation of the reduction was once wrong in Bison, and made it
547# miss some reductions. In the following test case, the reduction on
548# `undef_id_tok' in state 1 was missing. This is stripped down from
549# the actual web2c.y.
550
b9752825 551AT_SETUP([Web2c Report])
776209d6
AD
552
553AT_DATA([input.y],
554[[%token undef_id_tok const_id_tok
555
556%start CONST_DEC_PART
557\f
558%%
559CONST_DEC_PART:
560 CONST_DEC_LIST
561 ;
562
563CONST_DEC_LIST:
564 CONST_DEC
565 | CONST_DEC_LIST CONST_DEC
566 ;
567
568CONST_DEC:
569 { } undef_id_tok '=' const_id_tok ';'
570 ;
571%%
572
573]])
574
575AT_CHECK([bison -v input.y])
576
577AT_CHECK([sed -n 's/ *$//;/^$/!p' input.output], 0,
578[[Grammar
579 Number, Line, Rule
78d5bae9 580 0 6 $axiom -> CONST_DEC_PART $
776209d6
AD
581 1 6 CONST_DEC_PART -> CONST_DEC_LIST
582 2 10 CONST_DEC_LIST -> CONST_DEC
583 3 12 CONST_DEC_LIST -> CONST_DEC_LIST CONST_DEC
584 4 15 @1 -> /* empty */
585 5 15 CONST_DEC -> @1 undef_id_tok '=' const_id_tok ';'
586Terminals, with rules where they appear
78d5bae9 587$ (0) 0
776209d6
AD
588';' (59) 5
589'=' (61) 5
590error (256)
591undef_id_tok (257) 5
592const_id_tok (258) 5
593Nonterminals, with rules where they appear
78d5bae9
AD
594$axiom (7)
595 on left: 0
596CONST_DEC_PART (8)
597 on left: 1, on right: 0
598CONST_DEC_LIST (9)
776209d6 599 on left: 2 3, on right: 1 3
78d5bae9 600CONST_DEC (10)
776209d6 601 on left: 5, on right: 2 3
78d5bae9 602@1 (11)
776209d6
AD
603 on left: 4, on right: 5
604state 0
605 $default reduce using rule 4 (@1)
78d5bae9
AD
606 CONST_DEC_PART go to state 1
607 CONST_DEC_LIST go to state 2
608 CONST_DEC go to state 3
609 @1 go to state 4
776209d6 610state 1
78d5bae9
AD
611 $axiom -> CONST_DEC_PART . $ (rule 0)
612 $ shift, and go to state 5
613state 2
776209d6
AD
614 CONST_DEC_PART -> CONST_DEC_LIST . (rule 1)
615 CONST_DEC_LIST -> CONST_DEC_LIST . CONST_DEC (rule 3)
616 undef_id_tok reduce using rule 4 (@1)
617 $default reduce using rule 1 (CONST_DEC_PART)
78d5bae9
AD
618 CONST_DEC go to state 6
619 @1 go to state 4
620state 3
776209d6
AD
621 CONST_DEC_LIST -> CONST_DEC . (rule 2)
622 $default reduce using rule 2 (CONST_DEC_LIST)
776209d6 623state 4
78d5bae9
AD
624 CONST_DEC -> @1 . undef_id_tok '=' const_id_tok ';' (rule 5)
625 undef_id_tok shift, and go to state 7
626state 5
627 $axiom -> CONST_DEC_PART $ . (rule 0)
628 $default accept
629state 6
776209d6
AD
630 CONST_DEC_LIST -> CONST_DEC_LIST CONST_DEC . (rule 3)
631 $default reduce using rule 3 (CONST_DEC_LIST)
78d5bae9 632state 7
776209d6 633 CONST_DEC -> @1 undef_id_tok . '=' const_id_tok ';' (rule 5)
78d5bae9
AD
634 '=' shift, and go to state 8
635state 8
776209d6 636 CONST_DEC -> @1 undef_id_tok '=' . const_id_tok ';' (rule 5)
78d5bae9
AD
637 const_id_tok shift, and go to state 9
638state 9
776209d6 639 CONST_DEC -> @1 undef_id_tok '=' const_id_tok . ';' (rule 5)
78d5bae9
AD
640 ';' shift, and go to state 10
641state 10
776209d6
AD
642 CONST_DEC -> @1 undef_id_tok '=' const_id_tok ';' . (rule 5)
643 $default reduce using rule 5 (CONST_DEC)
776209d6
AD
644]])
645
646AT_CLEANUP
b9752825
AD
647
648
649## --------------- ##
650## Web2c Actions. ##
651## --------------- ##
652
653# The generation of the mapping `state -> action' was once wrong in
654# extremely specific situations. web2c.y exhibits this situation.
655# Below is a stripped version of the grammar. It looks like one can
656# simplify it further, but just don't: it is tuned to exhibit a bug,
657# which disapears when applying sane grammar transformations.
658#
659# It used to be wrong on yydefact only:
660#
661# static const short yydefact[] =
662# {
663# - 2, 0, 1, 0, 0, 2, 3, 2, 5, 4,
664# + 2, 0, 1, 0, 0, 0, 3, 2, 5, 4,
665# 0, 0
666# };
667#
668# but let's check all the tables.
669
670
671AT_SETUP([Web2c Actions])
672
673AT_DATA([input.y],
674[[%%
675statement: struct_stat;
676struct_stat: /* empty. */ | if else;
677if: "if" "const" "then" statement;
678else: "else" statement;
679%%
680]])
681
682AT_CHECK([bison -v input.y -o input.c])
683
684# Check only the tables. We don't use --no-parser, because it is
685# still to be implemented in the experimental branch of Bison.
686AT_CHECK([[sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c]], 0,
687[[static const char yytranslate[] =
688{
689 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
690 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
691 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
692 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
693 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
694 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
695 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
696 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
697 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
698 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
699 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
700 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
701 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
702 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
703 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
704 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
705 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
706 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
707 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
708 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
709 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
710 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
711 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
712 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
713 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
714 2, 2, 2, 2, 2, 2, 1, 3, 4, 5,
715 6
716};
717static const short yyprhs[] =
718{
e7b8bef1 719 0, 0, 3, 5, 6, 9, 14
b9752825
AD
720};
721static const short yyrhs[] =
722{
e7b8bef1
AD
723 8, 0, -1, 9, -1, -1, 10, 11, -1, 3,
724 4, 5, 8, -1, 6, 8, -1
b9752825
AD
725};
726static const short yyrline[] =
727{
e7b8bef1 728 0, 2, 2, 3, 3, 4, 5
b9752825
AD
729};
730static const char *const yytname[] =
731{
732 "$", "error", "$undefined.", "\"if\"", "\"const\"", "\"then\"",
e7b8bef1 733 "\"else\"", "$axiom", "statement", "struct_stat", "if", "else", NULL
b9752825
AD
734};
735static const short yytoknum[] =
736{
737 0, 256, 2, 257, 258, 259, 260, -1
738};
739static const short yyr1[] =
740{
e7b8bef1 741 0, 7, 8, 9, 9, 10, 11
b9752825
AD
742};
743static const short yyr2[] =
744{
e7b8bef1 745 0, 2, 1, 0, 2, 4, 2
b9752825
AD
746};
747static const short yydefact[] =
748{
e7b8bef1
AD
749 3, 0, 0, 2, 0, 0, 0, 3, 4, 3,
750 6, 5
b9752825
AD
751};
752static const short yydefgoto[] =
753{
e7b8bef1 754 -1, 2, 3, 4, 8
b9752825
AD
755};
756static const short yypact[] =
757{
e7b8bef1
AD
758 -2, -1, 4,-32768, 0, 2,-32768, -2,-32768, -2,
759 -32768,-32768
b9752825
AD
760};
761static const short yypgoto[] =
762{
e7b8bef1 763 -32768, -7,-32768,-32768,-32768
b9752825
AD
764};
765static const short yytable[] =
766{
e7b8bef1 767 10, 1, 11, 5, 6, 0, 7, 9
b9752825
AD
768};
769static const short yycheck[] =
770{
e7b8bef1 771 7, 3, 9, 4, 0, -1, 6, 5
b9752825
AD
772};
773]])
774
775AT_CLEANUP