]> git.saurik.com Git - bison.git/blame - tests/regression.at
* src/assoc.c, src/closure.c, src/gram.c, src/injections.c,
[bison.git] / tests / regression.at
CommitLineData
342b8b6e 1# Bison Regressions. -*- Autotest -*-
5504898e 2# Copyright (C) 2001, 2002 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 20
2b25d624 21
69078d4b
AD
22## ------------------------- ##
23## Early token definitions. ##
24## ------------------------- ##
25
26
27AT_SETUP([Early token definitions])
28
29# Found in GCJ: they expect the tokens to be defined before the user
30# prologue, so that they can use the token definitions in it.
31
32AT_DATA([input.y],
33[[%{
34void yyerror (const char *s);
35int yylex (void);
36%}
37
38%union
39{
40 int val;
41};
42%{
43#ifndef MY_TOKEN
44# error "MY_TOKEN not defined."
45#endif
46%}
47%token MY_TOKEN
48%%
49exp: MY_TOKEN;
50%%
51]])
52
53AT_CHECK([bison input.y -o input.c])
002b9b7d 54AT_COMPILE([input.o], [-c input.c])
69078d4b
AD
55
56AT_CLEANUP
57
58
59
2b25d624
AD
60## ---------------- ##
61## Braces parsing. ##
62## ---------------- ##
63
64
69078d4b 65AT_SETUP([Braces parsing])
2b25d624
AD
66
67AT_DATA([input.y],
68[[/* Bison used to swallow the character after `}'. */
69
70%%
bfcf1f3a 71exp: { tests = {{{{{{{{{{}}}}}}}}}}; };
2b25d624
AD
72%%
73]])
74
69078d4b 75AT_CHECK([bison -v input.y -o input.c])
2b25d624
AD
76
77AT_CHECK([fgrep 'tests = {{{{{{{{{{}}}}}}}}}};' input.c], 0, [ignore])
78
79AT_CLEANUP
80
81
c95f2d78
AD
82## ------------------ ##
83## Duplicate string. ##
84## ------------------ ##
85
86
87AT_SETUP([Duplicate string])
88
f499b062 89AT_DATA([input.y],
c95f2d78
AD
90[[/* `Bison -v' used to dump core when two tokens are defined with the same
91 string, as LE and GE below. */
92
93%token NUM
94%token LE "<="
95%token GE "<="
96
97%%
98exp: '(' exp ')' | NUM ;
99%%
100]])
101
69078d4b 102AT_CHECK([bison -v input.y -o input.c], 0, [],
a5d50994 103[[input.y:6.8-14: warning: symbol `"<="' used more than once as a literal string
69078d4b 104]])
c95f2d78 105
d803322e 106AT_CLEANUP
c95f2d78
AD
107
108
2ca209c1
AD
109## ------------------- ##
110## Rule Line Numbers. ##
111## ------------------- ##
112
113AT_SETUP([Rule Line Numbers])
114
6b98e4b5
AD
115AT_KEYWORDS([report])
116
2ca209c1
AD
117AT_DATA([input.y],
118[[%%
119expr:
120'a'
121
122{
123
124}
125
126'b'
127
128{
129
130}
131
132|
133
134
135{
136
137
138}
139
140'c'
141
142{
143
bfcf1f3a 144};
2ca209c1
AD
145]])
146
69078d4b 147AT_CHECK([bison input.y -o input.c -v])
2ca209c1
AD
148
149# Check the contents of the report.
150AT_CHECK([cat input.output], [],
d2d1b42b 151[[Grammar
2ca209c1 152
88bce5a2 153 0 $accept: expr $end
6b98e4b5
AD
154
155 1 @1: /* empty */
156
157 2 expr: 'a' @1 'b'
158
159 3 @2: /* empty */
160
161 4 expr: @2 'c'
2ca209c1 162
d2d1b42b 163
2ca209c1
AD
164Terminals, with rules where they appear
165
88bce5a2 166$end (0) 0
2ca209c1
AD
167'a' (97) 2
168'b' (98) 2
169'c' (99) 4
170error (256)
171
d2d1b42b 172
2ca209c1
AD
173Nonterminals, with rules where they appear
174
88bce5a2 175$accept (6)
b365aa05
AD
176 on left: 0
177expr (7)
178 on left: 2 4, on right: 0
179@1 (8)
2ca209c1 180 on left: 1, on right: 2
b365aa05 181@2 (9)
2ca209c1
AD
182 on left: 3, on right: 4
183
184
185state 0
186
88bce5a2 187 0 $accept: . expr $end
643a5994 188
87675353 189 'a' shift, and go to state 1
2ca209c1 190
87675353 191 $default reduce using rule 3 (@2)
2ca209c1 192
87675353
AD
193 expr go to state 2
194 @2 go to state 3
2ca209c1
AD
195
196
197state 1
198
ce4ccb4b 199 2 expr: 'a' . @1 'b'
2ca209c1 200
87675353 201 $default reduce using rule 1 (@1)
2ca209c1 202
87675353 203 @1 go to state 4
2ca209c1
AD
204
205
206state 2
207
88bce5a2 208 0 $accept: expr . $end
2ca209c1 209
88bce5a2 210 $end shift, and go to state 5
2ca209c1
AD
211
212
213state 3
214
ce4ccb4b 215 4 expr: @2 . 'c'
2ca209c1 216
87675353 217 'c' shift, and go to state 6
2ca209c1
AD
218
219
220state 4
221
ce4ccb4b 222 2 expr: 'a' @1 . 'b'
2ca209c1 223
87675353 224 'b' shift, and go to state 7
2ca209c1
AD
225
226
227state 5
228
88bce5a2 229 0 $accept: expr $end .
2ca209c1 230
e8832397 231 $default accept
2ca209c1
AD
232
233
234state 6
235
ce4ccb4b 236 4 expr: @2 'c' .
b365aa05 237
87675353 238 $default reduce using rule 4 (expr)
2ca209c1
AD
239
240
241state 7
242
ce4ccb4b 243 2 expr: 'a' @1 'b' .
b365aa05 244
87675353 245 $default reduce using rule 2 (expr)
2ca209c1
AD
246]])
247
248AT_CLEANUP
249
250
251
cd5aafcf
AD
252## ---------------------- ##
253## Mixing %token styles. ##
254## ---------------------- ##
255
256
257AT_SETUP([Mixing %token styles])
258
259# Taken from the documentation.
260AT_DATA([input.y],
261[[%token <operator> OR "||"
262%token <operator> LE 134 "<="
263%left OR "<="
264%%
265exp: ;
266%%
267]])
268
69078d4b 269AT_CHECK([bison -v input.y -o input.c])
cd5aafcf 270
d803322e 271AT_CLEANUP
cd5aafcf
AD
272
273
274
29ae55f1
AD
275## ---------------- ##
276## Invalid inputs. ##
277## ---------------- ##
561f9a30
AD
278
279
29ae55f1 280AT_SETUP([Invalid inputs])
561f9a30
AD
281
282AT_DATA([input.y],
283[[%%
284?
561f9a30 285default: 'a' }
29ae55f1
AD
286%&
287%a
288%-
e9955c83 289%{
561f9a30
AD
290]])
291
292AT_CHECK([bison input.y], [1], [],
e9955c83
AD
293[[input.y:2.1: invalid character: `?'
294input.y:3.14: invalid character: `}'
295input.y:4.1: invalid character: `%'
296input.y:4.2: invalid character: `&'
297input.y:5.1: invalid character: `%'
298input.y:6.1: invalid character: `%'
299input.y:6.2: invalid character: `-'
300input.y:7.1-8.0: unexpected end of file in a prologue
301input.y:7.1-8.0: parse error, unexpected PROLOGUE, expecting ";" or "|"
e0c40012 302]])
561f9a30
AD
303
304AT_CLEANUP
305
306
270a173c 307
b87f8b21
AD
308## ------------------- ##
309## Token definitions. ##
310## ------------------- ##
311
312
313AT_SETUP([Token definitions])
314
315# Bison managed, when fed with `%token 'f' "f"' to #define 'f'!
316AT_DATA([input.y],
db7c8e9a
AD
317[%{
318void yyerror (const char *s);
319int yylex (void);
320%}
e9955c83 321[%token YYEOF 0 "end of file"
b87f8b21 322%token 'a' "a"
e9955c83
AD
323%token b "b"
324%token c 'c'
325%token 'd' d
b87f8b21
AD
326%%
327exp: "a";
328]])
329
330AT_CHECK([bison input.y -o input.c])
002b9b7d 331AT_COMPILE([input.o], [-c input.c])
b87f8b21
AD
332AT_CLEANUP
333
334
335
b9752825
AD
336## -------------- ##
337## Web2c Report. ##
338## -------------- ##
776209d6
AD
339
340# The generation of the reduction was once wrong in Bison, and made it
341# miss some reductions. In the following test case, the reduction on
342# `undef_id_tok' in state 1 was missing. This is stripped down from
343# the actual web2c.y.
344
b9752825 345AT_SETUP([Web2c Report])
776209d6 346
6b98e4b5
AD
347AT_KEYWORDS([report])
348
776209d6
AD
349AT_DATA([input.y],
350[[%token undef_id_tok const_id_tok
351
352%start CONST_DEC_PART
353\f
354%%
355CONST_DEC_PART:
356 CONST_DEC_LIST
357 ;
358
359CONST_DEC_LIST:
360 CONST_DEC
361 | CONST_DEC_LIST CONST_DEC
362 ;
363
364CONST_DEC:
365 { } undef_id_tok '=' const_id_tok ';'
366 ;
367%%
776209d6
AD
368]])
369
370AT_CHECK([bison -v input.y])
87675353 371AT_CHECK([cat input.output], 0,
776209d6 372[[Grammar
87675353 373
88bce5a2 374 0 $accept: CONST_DEC_PART $end
87675353 375
6b98e4b5 376 1 CONST_DEC_PART: CONST_DEC_LIST
87675353 377
6b98e4b5
AD
378 2 CONST_DEC_LIST: CONST_DEC
379 3 | CONST_DEC_LIST CONST_DEC
87675353 380
6b98e4b5 381 4 @1: /* empty */
87675353 382
6b98e4b5 383 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';'
87675353
AD
384
385
776209d6 386Terminals, with rules where they appear
87675353 387
88bce5a2 388$end (0) 0
776209d6
AD
389';' (59) 5
390'=' (61) 5
391error (256)
007a50a4
AD
392undef_id_tok (258) 5
393const_id_tok (259) 5
87675353
AD
394
395
776209d6 396Nonterminals, with rules where they appear
87675353 397
88bce5a2 398$accept (7)
78d5bae9
AD
399 on left: 0
400CONST_DEC_PART (8)
401 on left: 1, on right: 0
402CONST_DEC_LIST (9)
776209d6 403 on left: 2 3, on right: 1 3
78d5bae9 404CONST_DEC (10)
776209d6 405 on left: 5, on right: 2 3
78d5bae9 406@1 (11)
776209d6 407 on left: 4, on right: 5
87675353
AD
408
409
776209d6 410state 0
87675353 411
88bce5a2 412 0 $accept: . CONST_DEC_PART $end
87675353
AD
413
414 $default reduce using rule 4 (@1)
415
416 CONST_DEC_PART go to state 1
417 CONST_DEC_LIST go to state 2
418 CONST_DEC go to state 3
419 @1 go to state 4
420
421
776209d6 422state 1
87675353 423
88bce5a2 424 0 $accept: CONST_DEC_PART . $end
87675353 425
88bce5a2 426 $end shift, and go to state 5
87675353
AD
427
428
78d5bae9 429state 2
87675353 430
ce4ccb4b
AD
431 1 CONST_DEC_PART: CONST_DEC_LIST .
432 3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC
87675353
AD
433
434 undef_id_tok reduce using rule 4 (@1)
435 $default reduce using rule 1 (CONST_DEC_PART)
436
437 CONST_DEC go to state 6
438 @1 go to state 4
439
440
78d5bae9 441state 3
87675353 442
ce4ccb4b 443 2 CONST_DEC_LIST: CONST_DEC .
87675353
AD
444
445 $default reduce using rule 2 (CONST_DEC_LIST)
446
447
776209d6 448state 4
87675353 449
ce4ccb4b 450 5 CONST_DEC: @1 . undef_id_tok '=' const_id_tok ';'
87675353
AD
451
452 undef_id_tok shift, and go to state 7
453
454
78d5bae9 455state 5
87675353 456
88bce5a2 457 0 $accept: CONST_DEC_PART $end .
87675353 458
e8832397 459 $default accept
87675353
AD
460
461
78d5bae9 462state 6
87675353 463
ce4ccb4b 464 3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC .
87675353
AD
465
466 $default reduce using rule 3 (CONST_DEC_LIST)
467
468
78d5bae9 469state 7
87675353 470
ce4ccb4b 471 5 CONST_DEC: @1 undef_id_tok . '=' const_id_tok ';'
87675353
AD
472
473 '=' shift, and go to state 8
474
475
78d5bae9 476state 8
87675353 477
ce4ccb4b 478 5 CONST_DEC: @1 undef_id_tok '=' . const_id_tok ';'
87675353
AD
479
480 const_id_tok shift, and go to state 9
481
482
78d5bae9 483state 9
87675353 484
ce4ccb4b 485 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok . ';'
87675353
AD
486
487 ';' shift, and go to state 10
488
489
78d5bae9 490state 10
87675353 491
ce4ccb4b 492 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' .
87675353
AD
493
494 $default reduce using rule 5 (CONST_DEC)
776209d6
AD
495]])
496
497AT_CLEANUP
b9752825
AD
498
499
500## --------------- ##
501## Web2c Actions. ##
502## --------------- ##
503
504# The generation of the mapping `state -> action' was once wrong in
505# extremely specific situations. web2c.y exhibits this situation.
506# Below is a stripped version of the grammar. It looks like one can
507# simplify it further, but just don't: it is tuned to exhibit a bug,
508# which disapears when applying sane grammar transformations.
509#
510# It used to be wrong on yydefact only:
511#
512# static const short yydefact[] =
513# {
514# - 2, 0, 1, 0, 0, 2, 3, 2, 5, 4,
515# + 2, 0, 1, 0, 0, 0, 3, 2, 5, 4,
516# 0, 0
517# };
518#
519# but let's check all the tables.
520
521
522AT_SETUP([Web2c Actions])
523
6b98e4b5
AD
524AT_KEYWORDS([report])
525
b9752825
AD
526AT_DATA([input.y],
527[[%%
528statement: struct_stat;
529struct_stat: /* empty. */ | if else;
530if: "if" "const" "then" statement;
531else: "else" statement;
532%%
533]])
534
535AT_CHECK([bison -v input.y -o input.c])
536
537# Check only the tables. We don't use --no-parser, because it is
538# still to be implemented in the experimental branch of Bison.
ce4ccb4b
AD
539[sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c]
540
541AT_CHECK([[cat tables.c]], 0,
c0c9ea05 542[[static const unsigned char yytranslate[] =
b9752825
AD
543{
544 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
545 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
546 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
547 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
548 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
549 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
550 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
551 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
552 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
553 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
554 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
555 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
556 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
557 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
558 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
559 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
560 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
561 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
562 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
563 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
564 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
565 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
566 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
567 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
568 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
007a50a4
AD
569 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
570 5, 6
b9752825 571};
5df5f6d5 572static const unsigned char yyprhs[] =
b9752825 573{
e7b8bef1 574 0, 0, 3, 5, 6, 9, 14
b9752825 575};
5df5f6d5 576static const signed char yyrhs[] =
b9752825 577{
e7b8bef1
AD
578 8, 0, -1, 9, -1, -1, 10, 11, -1, 3,
579 4, 5, 8, -1, 6, 8, -1
b9752825 580};
5df5f6d5 581static const unsigned char yyrline[] =
b9752825 582{
e7b8bef1 583 0, 2, 2, 3, 3, 4, 5
b9752825
AD
584};
585static const char *const yytname[] =
586{
88bce5a2
AD
587 "$end", "error", "$undefined", "\"if\"", "\"const\"", "\"then\"",
588 "\"else\"", "$accept", "statement", "struct_stat", "if", "else", 0
b9752825 589};
3650b4b8 590static const unsigned short yytoknum[] =
b9752825 591{
3650b4b8 592 0, 256, 257, 258, 259, 260, 261
b9752825 593};
c0c9ea05 594static const unsigned char yyr1[] =
b9752825 595{
e7b8bef1 596 0, 7, 8, 9, 9, 10, 11
b9752825 597};
5df5f6d5 598static const unsigned char yyr2[] =
b9752825 599{
e7b8bef1 600 0, 2, 1, 0, 2, 4, 2
b9752825 601};
a762e609 602static const unsigned char yydefact[] =
b9752825 603{
e8832397 604 3, 0, 0, 2, 0, 0, 1, 3, 4, 3,
e7b8bef1 605 6, 5
b9752825 606};
a762e609 607static const signed char yydefgoto[] =
b9752825 608{
e7b8bef1 609 -1, 2, 3, 4, 8
b9752825 610};
12b0043a 611static const signed char yypact[] =
b9752825 612{
12b0043a
AD
613 -2, -1, 4, -8, 0, 2, -8, -2, -8, -2,
614 -8, -8
b9752825 615};
a762e609 616static const signed char yypgoto[] =
b9752825 617{
12b0043a 618 -8, -7, -8, -8, -8
b9752825 619};
a762e609 620static const unsigned char yytable[] =
b9752825 621{
e7b8bef1 622 10, 1, 11, 5, 6, 0, 7, 9
b9752825 623};
a762e609 624static const signed char yycheck[] =
b9752825 625{
e7b8bef1 626 7, 3, 9, 4, 0, -1, 6, 5
b9752825 627};
5504898e
AD
628static const unsigned char yystos[] =
629{
630 0, 3, 8, 9, 10, 4, 0, 6, 11, 5,
631 8, 8
632};
b9752825
AD
633]])
634
635AT_CLEANUP