]> git.saurik.com Git - bison.git/blame_incremental - tests/regression.at
* src/reader.c (copy_dollar, copy_at): Better checking of `n' in
[bison.git] / tests / regression.at
... / ...
CommitLineData
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
19AT_BANNER([[Regression tests.]])
20
21## ------------------ ##
22## Duplicate string. ##
23## ------------------ ##
24
25
26AT_SETUP([Duplicate string])
27
28AT_DATA([input.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%%
37exp: '(' exp ')' | NUM ;
38%%
39]])
40
41AT_CHECK([bison -v input.y -o input.c], 0, ignore, ignore)
42
43AT_CLEANUP
44
45
46## ------------------------- ##
47## Unresolved SR Conflicts. ##
48## ------------------------- ##
49
50AT_SETUP([Unresolved SR Conflicts])
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], [],
64[[State 4 contains 1 shift/reduce conflict.
65
66
67Grammar
68
69 Number, Line, Rule
70 1 3 exp -> exp OP exp
71 2 3 exp -> NUM
72
73
74Terminals, with rules where they appear
75
76$ (-1)
77error (256)
78NUM (257) 2
79OP (258) 1
80
81
82Nonterminals, with rules where they appear
83
84exp (5)
85 on left: 1 2, on right: 1
86
87
88state 0
89
90 NUM shift, and go to state 1
91
92 exp go to state 2
93
94
95
96state 1
97
98 exp -> NUM . (rule 2)
99
100 $default reduce using rule 2 (exp)
101
102
103
104state 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
113state 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
123state 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
135state 5
136
137 $ shift, and go to state 6
138
139
140
141state 6
142
143 $default accept
144
145
146]])
147
148AT_CLEANUP
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], [],
168[[Conflict in state 4 between rule 1 and token OP resolved as shift.
169
170
171Grammar
172
173 Number, Line, Rule
174 1 4 exp -> exp OP exp
175 2 4 exp -> NUM
176
177
178Terminals, with rules where they appear
179
180$ (-1)
181error (256)
182NUM (257) 2
183OP (258) 1
184
185
186Nonterminals, with rules where they appear
187
188exp (5)
189 on left: 1 2, on right: 1
190
191
192state 0
193
194 NUM shift, and go to state 1
195
196 exp go to state 2
197
198
199
200state 1
201
202 exp -> NUM . (rule 2)
203
204 $default reduce using rule 2 (exp)
205
206
207
208state 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
217state 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
227state 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
238state 5
239
240 $ shift, and go to state 6
241
242
243
244state 6
245
246 $default accept
247
248
249]])
250
251AT_CLEANUP
252
253
254
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], [],
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
305Terminals, with rules where they appear
306
307$ (-1)
308'a' (97) 2
309'b' (98) 2
310'c' (99) 4
311error (256)
312
313
314Nonterminals, with rules where they appear
315
316expr (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
324state 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
335state 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
345state 2
346
347 expr -> @2 . 'c' (rule 4)
348
349 'c' shift, and go to state 4
350
351
352
353state 3
354
355 expr -> 'a' @1 . 'b' (rule 2)
356
357 'b' shift, and go to state 5
358
359
360
361state 4
362
363 expr -> @2 'c' . (rule 4)
364
365 $default reduce using rule 4 (expr)
366
367
368
369state 5
370
371 expr -> 'a' @1 'b' . (rule 2)
372
373 $default reduce using rule 2 (expr)
374
375
376
377state 6
378
379 $ shift, and go to state 7
380
381
382
383state 7
384
385 $default accept
386
387
388]])
389
390AT_CLEANUP
391
392
393
394## -------------------- ##
395## %expect not enough. ##
396## -------------------- ##
397
398AT_SETUP([%expect not enough])
399
400AT_DATA([input.y],
401[[%token NUM OP
402%expect 0
403%%
404exp: exp OP exp | NUM;
405]])
406
407AT_CHECK([bison input.y -o input.c], 1, [],
408[input.y contains 1 shift/reduce conflict.
409expected 0 shift/reduce conflicts
410])
411AT_CLEANUP
412
413
414## --------------- ##
415## %expect right. ##
416## --------------- ##
417
418AT_SETUP([%expect right])
419
420AT_DATA([input.y],
421[[%token NUM OP
422%expect 1
423%%
424exp: exp OP exp | NUM;
425]])
426
427AT_CHECK([bison input.y -o input.c], 0)
428AT_CLEANUP
429
430
431## ------------------ ##
432## %expect too much. ##
433## ------------------ ##
434
435AT_SETUP([%expect too much])
436
437AT_DATA([input.y],
438[[%token NUM OP
439%expect 2
440%%
441exp: exp OP exp | NUM;
442]])
443
444AT_CHECK([bison input.y -o input.c], 1, [],
445[input.y contains 1 shift/reduce conflict.
446expected 2 shift/reduce conflicts
447])
448AT_CLEANUP
449
450
451## ---------------------- ##
452## Mixing %token styles. ##
453## ---------------------- ##
454
455
456AT_SETUP([Mixing %token styles])
457
458# Taken from the documentation.
459AT_DATA([input.y],
460[[%token <operator> OR "||"
461%token <operator> LE 134 "<="
462%left OR "<="
463%%
464exp: ;
465%%
466]])
467
468AT_CHECK([bison -v input.y -o input.c], 0, ignore, ignore)
469
470AT_CLEANUP
471
472
473
474## ---------------------- ##
475## %union and --defines. ##
476## ---------------------- ##
477
478
479AT_SETUP([%union and --defines])
480
481AT_DATA([input.y],
482[%union
483{
484 int integer;
485 char *string ;
486}
487%%
488exp: {};
489])
490
491AT_CHECK([bison --defines input.y])
492
493AT_CLEANUP
494
495
496## --------------------------------------- ##
497## Duplicate '/' in C comments in %union ##
498## --------------------------------------- ##
499
500
501AT_SETUP([%union and C comments])
502
503AT_DATA([input.y],
504[%union
505{
506 /* The int. */ int integer;
507 /* The string. */ char *string ;
508}
509%%
510exp: {};
511])
512
513AT_CHECK([bison input.y -o input.c])
514AT_CHECK([fgrep '//*' input.c], [1], [])
515
516AT_CLEANUP
517
518
519## ----------------- ##
520## Invalid input 1. ##
521## ----------------- ##
522
523
524AT_SETUP([Invalid input: 1])
525
526AT_DATA([input.y],
527[[%%
528?
529]])
530
531AT_CHECK([bison input.y], [1], [],
532[[input.y:2: invalid input: `?'
533input.y:3: fatal error: no rules in the input grammar
534]])
535
536AT_CLEANUP
537
538
539## ----------------- ##
540## Invalid input 2. ##
541## ----------------- ##
542
543
544AT_SETUP([Invalid input: 2])
545
546AT_DATA([input.y],
547[[%%
548default: 'a' }
549]])
550
551AT_CHECK([bison input.y], [1], [],
552[[input.y:2: invalid input: `}'
553]])
554
555AT_CLEANUP
556
557
558
559## -------------------- ##
560## Invalid %directive. ##
561## -------------------- ##
562
563
564AT_SETUP([Invalid %directive])
565
566AT_DATA([input.y],
567[[%invalid
568]])
569
570AT_CHECK([bison input.y], [1], [],
571[[input.y:1: unrecognized: %invalid
572input.y:1: Skipping to next %
573input.y:2: fatal error: no input grammar
574]])
575
576AT_CLEANUP
577
578
579
580## --------------------- ##
581## Invalid CPP headers. ##
582## --------------------- ##
583
584# AT_TEST_CPP_GUARD_H([INPUT-FILE-BASE)
585# -------------------------------------
586m4_define([AT_TEST_CPP_GUARD_H],
587[AT_SETUP([Invalid CPP guards: $1])
588
589# Possibly create inner directories.
590dirname=`AS_DIRNAME([$1])`
591AS_MKDIR_P([$dirname])
592
593AT_DATA([$1.y],
594[%%
595dummy:
596])
597
598AT_CHECK([bison --defines=$1.h $1.y])
599
600# CPP should be happy with it.
601AT_CHECK([$CC -E $1.h], 0, [ignore])
602
603AT_CLEANUP
604])
605
606AT_TEST_CPP_GUARD_H([input/input])
607AT_TEST_CPP_GUARD_H([9foo])
608
609
610
611## -------------- ##
612## Web2c Report. ##
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
620AT_SETUP([Web2c Report])
621
622AT_DATA([input.y],
623[[%token undef_id_tok const_id_tok
624
625%start CONST_DEC_PART
626\f
627%%
628CONST_DEC_PART:
629 CONST_DEC_LIST
630 ;
631
632CONST_DEC_LIST:
633 CONST_DEC
634 | CONST_DEC_LIST CONST_DEC
635 ;
636
637CONST_DEC:
638 { } undef_id_tok '=' const_id_tok ';'
639 ;
640%%
641
642]])
643
644AT_CHECK([bison -v input.y])
645
646AT_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 ';'
654Terminals, with rules where they appear
655$ (-1)
656';' (59) 5
657'=' (61) 5
658error (256)
659undef_id_tok (257) 5
660const_id_tok (258) 5
661Nonterminals, with rules where they appear
662CONST_DEC_PART (7)
663 on left: 1
664CONST_DEC_LIST (8)
665 on left: 2 3, on right: 1 3
666CONST_DEC (9)
667 on left: 5, on right: 2 3
668@1 (10)
669 on left: 4, on right: 5
670state 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
676state 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
683state 2
684 CONST_DEC_LIST -> CONST_DEC . (rule 2)
685 $default reduce using rule 2 (CONST_DEC_LIST)
686state 3
687 CONST_DEC -> @1 . undef_id_tok '=' const_id_tok ';' (rule 5)
688 undef_id_tok shift, and go to state 5
689state 4
690 CONST_DEC_LIST -> CONST_DEC_LIST CONST_DEC . (rule 3)
691 $default reduce using rule 3 (CONST_DEC_LIST)
692state 5
693 CONST_DEC -> @1 undef_id_tok . '=' const_id_tok ';' (rule 5)
694 '=' shift, and go to state 6
695state 6
696 CONST_DEC -> @1 undef_id_tok '=' . const_id_tok ';' (rule 5)
697 const_id_tok shift, and go to state 7
698state 7
699 CONST_DEC -> @1 undef_id_tok '=' const_id_tok . ';' (rule 5)
700 ';' shift, and go to state 8
701state 8
702 CONST_DEC -> @1 undef_id_tok '=' const_id_tok ';' . (rule 5)
703 $default reduce using rule 5 (CONST_DEC)
704state 9
705 $ shift, and go to state 10
706state 10
707 $default accept
708]])
709
710AT_CLEANUP
711
712
713## --------------- ##
714## Web2c Actions. ##
715## --------------- ##
716
717# The generation of the mapping `state -> action' was once wrong in
718# extremely specific situations. web2c.y exhibits this situation.
719# Below is a stripped version of the grammar. It looks like one can
720# simplify it further, but just don't: it is tuned to exhibit a bug,
721# which disapears when applying sane grammar transformations.
722#
723# It used to be wrong on yydefact only:
724#
725# static const short yydefact[] =
726# {
727# - 2, 0, 1, 0, 0, 2, 3, 2, 5, 4,
728# + 2, 0, 1, 0, 0, 0, 3, 2, 5, 4,
729# 0, 0
730# };
731#
732# but let's check all the tables.
733
734
735AT_SETUP([Web2c Actions])
736
737AT_DATA([input.y],
738[[%%
739statement: struct_stat;
740struct_stat: /* empty. */ | if else;
741if: "if" "const" "then" statement;
742else: "else" statement;
743%%
744]])
745
746AT_CHECK([bison -v input.y -o input.c])
747
748# Check only the tables. We don't use --no-parser, because it is
749# still to be implemented in the experimental branch of Bison.
750AT_CHECK([[sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c]], 0,
751[[static const char yytranslate[] =
752{
753 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
754 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
755 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
756 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
757 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
758 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
759 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
760 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
761 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
762 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
763 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
764 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
765 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
766 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
767 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
768 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
769 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
770 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
771 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
772 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
773 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
774 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
775 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
776 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
777 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
778 2, 2, 2, 2, 2, 2, 1, 3, 4, 5,
779 6
780};
781static const short yyprhs[] =
782{
783 0, 0, 2, 3, 6, 11
784};
785static const short yyrhs[] =
786{
787 8, 0, 0, 9, 10, 0, 3, 4, 5, 7,
788 0, 6, 7, 0
789};
790static const short yyrline[] =
791{
792 0, 2, 3, 3, 4, 5
793};
794static const char *const yytname[] =
795{
796 "$", "error", "$undefined.", "\"if\"", "\"const\"", "\"then\"",
797 "\"else\"", "statement", "struct_stat", "if", "else", NULL
798};
799static const short yytoknum[] =
800{
801 0, 256, 2, 257, 258, 259, 260, -1
802};
803static const short yyr1[] =
804{
805 0, 7, 8, 8, 9, 10
806};
807static const short yyr2[] =
808{
809 0, 1, 0, 2, 4, 2
810};
811static const short yydefact[] =
812{
813 2, 0, 1, 0, 0, 2, 3, 2, 5, 4,
814 0, 0
815};
816static const short yydefgoto[] =
817{
818 8, 2, 3, 6
819};
820static const short yypact[] =
821{
822 -2, -1,-32768, -4, 1, -2,-32768, -2,-32768,-32768,
823 4,-32768
824};
825static const short yypgoto[] =
826{
827 0,-32768,-32768,-32768
828};
829static const short yytable[] =
830{
831 10, 1, 5, 4, 11, 0, 7, 9
832};
833static const short yycheck[] =
834{
835 0, 3, 6, 4, 0, -1, 5, 7
836};
837]])
838
839AT_CLEANUP