]> git.saurik.com Git - bison.git/blame - tests/regression.at
GLR parsers sometimes raise parse errors instead of performing the
[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 76
a4bf0390 77AT_CHECK([grep 'tests = {{{{{{{{{{}}}}}}}}}};' input.c], 0, [ignore])
2b25d624
AD
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
54d25cfb 301input.y:7.1-8.0: parse error, unexpected "%{...%}", 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
eb714592
AD
336## -------------------- ##
337## Characters Escapes. ##
338## -------------------- ##
339
340
341AT_SETUP([Characters Escapes])
342
343AT_DATA([input.y],
344[%{
345void yyerror (const char *s);
346int yylex (void);
347%}
348[%%
349exp:
350 '\'' "\'"
351| '\"' "\""
352| '"' "'"
353;
354]])
355
356AT_CHECK([bison input.y -o input.c])
357AT_COMPILE([input.o], [-c input.c])
358AT_CLEANUP
359
360
361
b9752825
AD
362## -------------- ##
363## Web2c Report. ##
364## -------------- ##
776209d6
AD
365
366# The generation of the reduction was once wrong in Bison, and made it
367# miss some reductions. In the following test case, the reduction on
368# `undef_id_tok' in state 1 was missing. This is stripped down from
369# the actual web2c.y.
370
b9752825 371AT_SETUP([Web2c Report])
776209d6 372
6b98e4b5
AD
373AT_KEYWORDS([report])
374
776209d6
AD
375AT_DATA([input.y],
376[[%token undef_id_tok const_id_tok
377
378%start CONST_DEC_PART
379\f
380%%
381CONST_DEC_PART:
382 CONST_DEC_LIST
383 ;
384
385CONST_DEC_LIST:
386 CONST_DEC
387 | CONST_DEC_LIST CONST_DEC
388 ;
389
390CONST_DEC:
391 { } undef_id_tok '=' const_id_tok ';'
392 ;
393%%
776209d6
AD
394]])
395
396AT_CHECK([bison -v input.y])
87675353 397AT_CHECK([cat input.output], 0,
776209d6 398[[Grammar
87675353 399
88bce5a2 400 0 $accept: CONST_DEC_PART $end
87675353 401
6b98e4b5 402 1 CONST_DEC_PART: CONST_DEC_LIST
87675353 403
6b98e4b5
AD
404 2 CONST_DEC_LIST: CONST_DEC
405 3 | CONST_DEC_LIST CONST_DEC
87675353 406
6b98e4b5 407 4 @1: /* empty */
87675353 408
6b98e4b5 409 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';'
87675353
AD
410
411
776209d6 412Terminals, with rules where they appear
87675353 413
88bce5a2 414$end (0) 0
776209d6
AD
415';' (59) 5
416'=' (61) 5
417error (256)
007a50a4
AD
418undef_id_tok (258) 5
419const_id_tok (259) 5
87675353
AD
420
421
776209d6 422Nonterminals, with rules where they appear
87675353 423
88bce5a2 424$accept (7)
78d5bae9
AD
425 on left: 0
426CONST_DEC_PART (8)
427 on left: 1, on right: 0
428CONST_DEC_LIST (9)
776209d6 429 on left: 2 3, on right: 1 3
78d5bae9 430CONST_DEC (10)
776209d6 431 on left: 5, on right: 2 3
78d5bae9 432@1 (11)
776209d6 433 on left: 4, on right: 5
87675353
AD
434
435
776209d6 436state 0
87675353 437
88bce5a2 438 0 $accept: . CONST_DEC_PART $end
87675353
AD
439
440 $default reduce using rule 4 (@1)
441
442 CONST_DEC_PART go to state 1
443 CONST_DEC_LIST go to state 2
444 CONST_DEC go to state 3
445 @1 go to state 4
446
447
776209d6 448state 1
87675353 449
88bce5a2 450 0 $accept: CONST_DEC_PART . $end
87675353 451
88bce5a2 452 $end shift, and go to state 5
87675353
AD
453
454
78d5bae9 455state 2
87675353 456
ce4ccb4b
AD
457 1 CONST_DEC_PART: CONST_DEC_LIST .
458 3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC
87675353
AD
459
460 undef_id_tok reduce using rule 4 (@1)
461 $default reduce using rule 1 (CONST_DEC_PART)
462
463 CONST_DEC go to state 6
464 @1 go to state 4
465
466
78d5bae9 467state 3
87675353 468
ce4ccb4b 469 2 CONST_DEC_LIST: CONST_DEC .
87675353
AD
470
471 $default reduce using rule 2 (CONST_DEC_LIST)
472
473
776209d6 474state 4
87675353 475
ce4ccb4b 476 5 CONST_DEC: @1 . undef_id_tok '=' const_id_tok ';'
87675353
AD
477
478 undef_id_tok shift, and go to state 7
479
480
78d5bae9 481state 5
87675353 482
88bce5a2 483 0 $accept: CONST_DEC_PART $end .
87675353 484
e8832397 485 $default accept
87675353
AD
486
487
78d5bae9 488state 6
87675353 489
ce4ccb4b 490 3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC .
87675353
AD
491
492 $default reduce using rule 3 (CONST_DEC_LIST)
493
494
78d5bae9 495state 7
87675353 496
ce4ccb4b 497 5 CONST_DEC: @1 undef_id_tok . '=' const_id_tok ';'
87675353
AD
498
499 '=' shift, and go to state 8
500
501
78d5bae9 502state 8
87675353 503
ce4ccb4b 504 5 CONST_DEC: @1 undef_id_tok '=' . const_id_tok ';'
87675353
AD
505
506 const_id_tok shift, and go to state 9
507
508
78d5bae9 509state 9
87675353 510
ce4ccb4b 511 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok . ';'
87675353
AD
512
513 ';' shift, and go to state 10
514
515
78d5bae9 516state 10
87675353 517
ce4ccb4b 518 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' .
87675353
AD
519
520 $default reduce using rule 5 (CONST_DEC)
776209d6
AD
521]])
522
523AT_CLEANUP
b9752825
AD
524
525
526## --------------- ##
527## Web2c Actions. ##
528## --------------- ##
529
530# The generation of the mapping `state -> action' was once wrong in
531# extremely specific situations. web2c.y exhibits this situation.
532# Below is a stripped version of the grammar. It looks like one can
533# simplify it further, but just don't: it is tuned to exhibit a bug,
534# which disapears when applying sane grammar transformations.
535#
536# It used to be wrong on yydefact only:
537#
538# static const short yydefact[] =
539# {
540# - 2, 0, 1, 0, 0, 2, 3, 2, 5, 4,
541# + 2, 0, 1, 0, 0, 0, 3, 2, 5, 4,
542# 0, 0
543# };
544#
545# but let's check all the tables.
546
547
548AT_SETUP([Web2c Actions])
549
6b98e4b5
AD
550AT_KEYWORDS([report])
551
b9752825
AD
552AT_DATA([input.y],
553[[%%
554statement: struct_stat;
555struct_stat: /* empty. */ | if else;
556if: "if" "const" "then" statement;
557else: "else" statement;
558%%
559]])
560
561AT_CHECK([bison -v input.y -o input.c])
562
563# Check only the tables. We don't use --no-parser, because it is
564# still to be implemented in the experimental branch of Bison.
ce4ccb4b
AD
565[sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c]
566
567AT_CHECK([[cat tables.c]], 0,
c0c9ea05 568[[static const unsigned char yytranslate[] =
b9752825
AD
569{
570 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
571 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
572 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
573 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
574 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
575 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
576 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
577 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
578 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
579 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
580 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
581 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
582 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
583 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
584 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
585 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
586 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
587 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
588 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
589 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
590 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
591 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
592 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
593 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
594 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
007a50a4
AD
595 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
596 5, 6
b9752825 597};
5df5f6d5 598static const unsigned char yyprhs[] =
b9752825 599{
e7b8bef1 600 0, 0, 3, 5, 6, 9, 14
b9752825 601};
5df5f6d5 602static const signed char yyrhs[] =
b9752825 603{
e7b8bef1
AD
604 8, 0, -1, 9, -1, -1, 10, 11, -1, 3,
605 4, 5, 8, -1, 6, 8, -1
b9752825 606};
5df5f6d5 607static const unsigned char yyrline[] =
b9752825 608{
e7b8bef1 609 0, 2, 2, 3, 3, 4, 5
b9752825
AD
610};
611static const char *const yytname[] =
612{
88bce5a2
AD
613 "$end", "error", "$undefined", "\"if\"", "\"const\"", "\"then\"",
614 "\"else\"", "$accept", "statement", "struct_stat", "if", "else", 0
b9752825 615};
3650b4b8 616static const unsigned short yytoknum[] =
b9752825 617{
3650b4b8 618 0, 256, 257, 258, 259, 260, 261
b9752825 619};
c0c9ea05 620static const unsigned char yyr1[] =
b9752825 621{
e7b8bef1 622 0, 7, 8, 9, 9, 10, 11
b9752825 623};
5df5f6d5 624static const unsigned char yyr2[] =
b9752825 625{
e7b8bef1 626 0, 2, 1, 0, 2, 4, 2
b9752825 627};
a762e609 628static const unsigned char yydefact[] =
b9752825 629{
e8832397 630 3, 0, 0, 2, 0, 0, 1, 3, 4, 3,
e7b8bef1 631 6, 5
b9752825 632};
a762e609 633static const signed char yydefgoto[] =
b9752825 634{
e7b8bef1 635 -1, 2, 3, 4, 8
b9752825 636};
12b0043a 637static const signed char yypact[] =
b9752825 638{
12b0043a
AD
639 -2, -1, 4, -8, 0, 2, -8, -2, -8, -2,
640 -8, -8
b9752825 641};
a762e609 642static const signed char yypgoto[] =
b9752825 643{
12b0043a 644 -8, -7, -8, -8, -8
b9752825 645};
a762e609 646static const unsigned char yytable[] =
b9752825 647{
e7b8bef1 648 10, 1, 11, 5, 6, 0, 7, 9
b9752825 649};
a762e609 650static const signed char yycheck[] =
b9752825 651{
e7b8bef1 652 7, 3, 9, 4, 0, -1, 6, 5
b9752825 653};
5504898e
AD
654static const unsigned char yystos[] =
655{
656 0, 3, 8, 9, 10, 4, 0, 6, 11, 5,
657 8, 8
658};
b9752825
AD
659]])
660
661AT_CLEANUP