]> git.saurik.com Git - bison.git/blame - tests/regression.at
Miscellaneous %define and %code cleanup.
[bison.git] / tests / regression.at
CommitLineData
342b8b6e 1# Bison Regressions. -*- Autotest -*-
d42cf844
PE
2
3# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software
4# Foundation, Inc.
c95f2d78 5
342b8b6e
AD
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2, or (at your option)
9# any later version.
c95f2d78 10
342b8b6e
AD
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
c95f2d78 15
342b8b6e
AD
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
0fb669f9
PE
18# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19# 02110-1301, USA.
c95f2d78 20
342b8b6e 21AT_BANNER([[Regression tests.]])
c95f2d78 22
2b25d624 23
276f48df
PE
24## ------------------ ##
25## Trivial grammars. ##
26## ------------------ ##
27
28AT_SETUP([Trivial grammars])
29
30AT_DATA_GRAMMAR([input.y],
31[[%{
32void yyerror (char const *);
33int yylex (void);
50cce58e 34#define YYSTYPE int *
276f48df
PE
35%}
36
37%error-verbose
38
39%%
40
41program: 'x';
42]])
43
44AT_CHECK([bison -o input.c input.y])
45AT_COMPILE([input.o], [-c input.c])
50cce58e 46AT_COMPILE([input.o], [-DYYDEBUG -c input.c])
276f48df
PE
47
48AT_CLEANUP
49
50
51
ddc8ede1
PE
52## ----------------- ##
53## YYSTYPE typedef. ##
54## ----------------- ##
55
56AT_SETUP([YYSTYPE typedef])
57
58AT_DATA_GRAMMAR([input.y],
59[[%{
60void yyerror (char const *);
61int yylex (void);
62typedef union { char const *val; } YYSTYPE;
63%}
64
65%type <val> program
66
67%%
68
69program: { $$ = ""; };
70]])
71
72AT_CHECK([bison -o input.c input.y])
73AT_COMPILE([input.o], [-c input.c])
74
75AT_CLEANUP
76
77
78
b931235e
JD
79## ------------------------------------- ##
80## Early token definitions with --yacc. ##
81## ------------------------------------- ##
69078d4b
AD
82
83
b931235e 84AT_SETUP([Early token definitions with --yacc])
69078d4b
AD
85
86# Found in GCJ: they expect the tokens to be defined before the user
87# prologue, so that they can use the token definitions in it.
88
9501dc6e 89AT_DATA_GRAMMAR([input.y],
69078d4b
AD
90[[%{
91void yyerror (const char *s);
92int yylex (void);
93%}
94
95%union
96{
97 int val;
98};
9bc0dd67
JD
99%{
100#ifndef MY_TOKEN
101# error "MY_TOKEN not defined."
102#endif
103%}
b931235e
JD
104%token MY_TOKEN
105%%
106exp: MY_TOKEN;
107%%
108]])
109
110AT_CHECK([bison -y -o input.c input.y])
111AT_COMPILE([input.o], [-c input.c])
112
113AT_CLEANUP
114
115
116
117## ---------------------------------------- ##
118## Early token definitions without --yacc. ##
119## ---------------------------------------- ##
120
121
122AT_SETUP([Early token definitions without --yacc])
123
124# Found in GCJ: they expect the tokens to be defined before the user
125# prologue, so that they can use the token definitions in it.
126
127AT_DATA_GRAMMAR([input.y],
128[[%{
129#include <stdio.h>
130void yyerror (const char *s);
131int yylex (void);
132void print_my_token (void);
9bc0dd67
JD
133%}
134
135%union
136{
137 int val;
138};
139%{
b931235e
JD
140void
141print_my_token (void)
142{
143 enum yytokentype my_token = MY_TOKEN;
144 printf ("%d\n", my_token);
145}
69078d4b
AD
146%}
147%token MY_TOKEN
148%%
149exp: MY_TOKEN;
150%%
151]])
152
b56471a6 153AT_CHECK([bison -o input.c input.y])
002b9b7d 154AT_COMPILE([input.o], [-c input.c])
69078d4b
AD
155
156AT_CLEANUP
157
158
159
2b25d624
AD
160## ---------------- ##
161## Braces parsing. ##
162## ---------------- ##
163
164
69078d4b 165AT_SETUP([Braces parsing])
2b25d624
AD
166
167AT_DATA([input.y],
168[[/* Bison used to swallow the character after `}'. */
169
170%%
bfcf1f3a 171exp: { tests = {{{{{{{{{{}}}}}}}}}}; };
2b25d624
AD
172%%
173]])
174
b56471a6 175AT_CHECK([bison -v -o input.c input.y])
2b25d624 176
a4bf0390 177AT_CHECK([grep 'tests = {{{{{{{{{{}}}}}}}}}};' input.c], 0, [ignore])
2b25d624
AD
178
179AT_CLEANUP
180
181
c95f2d78
AD
182## ------------------ ##
183## Duplicate string. ##
184## ------------------ ##
185
186
187AT_SETUP([Duplicate string])
188
f499b062 189AT_DATA([input.y],
c95f2d78
AD
190[[/* `Bison -v' used to dump core when two tokens are defined with the same
191 string, as LE and GE below. */
192
193%token NUM
194%token LE "<="
195%token GE "<="
196
197%%
198exp: '(' exp ')' | NUM ;
199%%
200]])
201
b56471a6 202AT_CHECK([bison -v -o input.c input.y], 0, [],
a5d50994 203[[input.y:6.8-14: warning: symbol `"<="' used more than once as a literal string
69078d4b 204]])
c95f2d78 205
d803322e 206AT_CLEANUP
c95f2d78
AD
207
208
2ca209c1
AD
209## ------------------- ##
210## Rule Line Numbers. ##
211## ------------------- ##
212
213AT_SETUP([Rule Line Numbers])
214
6b98e4b5
AD
215AT_KEYWORDS([report])
216
2ca209c1
AD
217AT_DATA([input.y],
218[[%%
219expr:
220'a'
221
222{
223
224}
225
226'b'
227
228{
229
230}
231
232|
233
234
235{
236
237
238}
239
240'c'
241
242{
243
bfcf1f3a 244};
2ca209c1
AD
245]])
246
b56471a6 247AT_CHECK([bison -o input.c -v input.y])
2ca209c1
AD
248
249# Check the contents of the report.
250AT_CHECK([cat input.output], [],
d2d1b42b 251[[Grammar
2ca209c1 252
88bce5a2 253 0 $accept: expr $end
6b98e4b5 254
f91b1629 255 1 $@1: /* empty */
6b98e4b5 256
f91b1629 257 2 expr: 'a' $@1 'b'
6b98e4b5 258
f91b1629 259 3 $@2: /* empty */
6b98e4b5 260
f91b1629 261 4 expr: $@2 'c'
2ca209c1 262
d2d1b42b 263
2ca209c1
AD
264Terminals, with rules where they appear
265
88bce5a2 266$end (0) 0
2ca209c1
AD
267'a' (97) 2
268'b' (98) 2
269'c' (99) 4
270error (256)
271
d2d1b42b 272
2ca209c1
AD
273Nonterminals, with rules where they appear
274
88bce5a2 275$accept (6)
b365aa05
AD
276 on left: 0
277expr (7)
278 on left: 2 4, on right: 0
f91b1629 279$@1 (8)
2ca209c1 280 on left: 1, on right: 2
f91b1629 281$@2 (9)
2ca209c1
AD
282 on left: 3, on right: 4
283
284
285state 0
286
88bce5a2 287 0 $accept: . expr $end
643a5994 288
87675353 289 'a' shift, and go to state 1
2ca209c1 290
f91b1629 291 $default reduce using rule 3 ($@2)
2ca209c1 292
87675353 293 expr go to state 2
f91b1629 294 $@2 go to state 3
2ca209c1
AD
295
296
297state 1
298
f91b1629 299 2 expr: 'a' . $@1 'b'
2ca209c1 300
f91b1629 301 $default reduce using rule 1 ($@1)
2ca209c1 302
f91b1629 303 $@1 go to state 4
2ca209c1
AD
304
305
306state 2
307
88bce5a2 308 0 $accept: expr . $end
2ca209c1 309
88bce5a2 310 $end shift, and go to state 5
2ca209c1
AD
311
312
313state 3
314
f91b1629 315 4 expr: $@2 . 'c'
2ca209c1 316
87675353 317 'c' shift, and go to state 6
2ca209c1
AD
318
319
320state 4
321
f91b1629 322 2 expr: 'a' $@1 . 'b'
2ca209c1 323
87675353 324 'b' shift, and go to state 7
2ca209c1
AD
325
326
327state 5
328
88bce5a2 329 0 $accept: expr $end .
2ca209c1 330
e8832397 331 $default accept
2ca209c1
AD
332
333
334state 6
335
f91b1629 336 4 expr: $@2 'c' .
b365aa05 337
87675353 338 $default reduce using rule 4 (expr)
2ca209c1
AD
339
340
341state 7
342
f91b1629 343 2 expr: 'a' $@1 'b' .
b365aa05 344
87675353 345 $default reduce using rule 2 (expr)
2ca209c1
AD
346]])
347
348AT_CLEANUP
349
350
351
cd5aafcf
AD
352## ---------------------- ##
353## Mixing %token styles. ##
354## ---------------------- ##
355
356
357AT_SETUP([Mixing %token styles])
358
359# Taken from the documentation.
360AT_DATA([input.y],
361[[%token <operator> OR "||"
362%token <operator> LE 134 "<="
363%left OR "<="
364%%
365exp: ;
366%%
367]])
368
b56471a6 369AT_CHECK([bison -v -o input.c input.y])
cd5aafcf 370
d803322e 371AT_CLEANUP
cd5aafcf
AD
372
373
374
29ae55f1
AD
375## ---------------- ##
376## Invalid inputs. ##
377## ---------------- ##
561f9a30
AD
378
379
29ae55f1 380AT_SETUP([Invalid inputs])
561f9a30
AD
381
382AT_DATA([input.y],
383[[%%
384?
561f9a30 385default: 'a' }
29ae55f1 386%&
2dfbfc12 387%a-does-not-exist
29ae55f1 388%-
e9955c83 389%{
561f9a30
AD
390]])
391
392AT_CHECK([bison input.y], [1], [],
e9955c83
AD
393[[input.y:2.1: invalid character: `?'
394input.y:3.14: invalid character: `}'
395input.y:4.1: invalid character: `%'
396input.y:4.2: invalid character: `&'
2dfbfc12 397input.y:5.1-17: invalid directive: `%a-does-not-exist'
e9955c83
AD
398input.y:6.1: invalid character: `%'
399input.y:6.2: invalid character: `-'
2115939b 400input.y:7.1-8.0: missing `%}' at end of file
47aee066 401input.y:7.1-8.0: syntax error, unexpected %{...%}
e0c40012 402]])
561f9a30
AD
403
404AT_CLEANUP
405
406
fc01665e
PE
407AT_SETUP([Invalid inputs with {}])
408
409AT_DATA([input.y],
410[[
411%destructor
412%initial-action
413%lex-param
414%parse-param
415%printer
416%union
417]])
418
419AT_CHECK([bison input.y], [1], [],
e9071366 420[[input.y:3.1-15: syntax error, unexpected %initial-action, expecting {...}
fc01665e
PE
421]])
422
423AT_CLEANUP
424
425
270a173c 426
b87f8b21
AD
427## ------------------- ##
428## Token definitions. ##
429## ------------------- ##
430
431
432AT_SETUP([Token definitions])
433
434# Bison managed, when fed with `%token 'f' "f"' to #define 'f'!
9501dc6e 435AT_DATA_GRAMMAR([input.y],
db7c8e9a 436[%{
cf806753 437#include <stdlib.h>
ca407bdf 438#include <stdio.h>
db7c8e9a
AD
439void yyerror (const char *s);
440int yylex (void);
441%}
ca407bdf
PE
442[%error-verbose
443%token MYEOF 0 "end of file"
b87f8b21 444%token 'a' "a"
4f136612
PE
445%token B_TOKEN "b"
446%token C_TOKEN 'c'
447%token 'd' D_TOKEN
3d54b576 448%token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
b87f8b21 449%%
3d54b576 450exp: "a" "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!";
ca407bdf
PE
451%%
452void
453yyerror (char const *s)
454{
455 fprintf (stderr, "%s\n", s);
456}
457
458int
459yylex (void)
460{
cf806753
PE
461 static int called;
462 if (called++)
463 abort ();
ca407bdf
PE
464 return SPECIAL;
465}
466
467int
468main (void)
469{
470 return yyparse ();
471}
b87f8b21
AD
472]])
473
b56471a6 474AT_CHECK([bison -o input.c input.y])
ca407bdf 475AT_COMPILE([input])
3d54b576
PE
476AT_DATA([experr],
477[[syntax error, unexpected "\\'?\"\a\b\f\n\r\t\v\001\201\001\201?\?!", expecting a
478]])
479AT_PARSER_CHECK([./input], 1, [], [experr])
b87f8b21
AD
480AT_CLEANUP
481
482
483
eb714592
AD
484## -------------------- ##
485## Characters Escapes. ##
486## -------------------- ##
487
488
489AT_SETUP([Characters Escapes])
490
9501dc6e 491AT_DATA_GRAMMAR([input.y],
eb714592
AD
492[%{
493void yyerror (const char *s);
494int yylex (void);
495%}
6d0ef4ec 496[%%
eb714592
AD
497exp:
498 '\'' "\'"
499| '\"' "\""
500| '"' "'"
501;
502]])
9501dc6e 503# Pacify font-lock-mode: "
eb714592 504
b56471a6 505AT_CHECK([bison -o input.c input.y])
eb714592
AD
506AT_COMPILE([input.o], [-c input.c])
507AT_CLEANUP
508
509
510
b9752825
AD
511## -------------- ##
512## Web2c Report. ##
513## -------------- ##
776209d6
AD
514
515# The generation of the reduction was once wrong in Bison, and made it
516# miss some reductions. In the following test case, the reduction on
517# `undef_id_tok' in state 1 was missing. This is stripped down from
518# the actual web2c.y.
519
b9752825 520AT_SETUP([Web2c Report])
776209d6 521
6b98e4b5
AD
522AT_KEYWORDS([report])
523
776209d6
AD
524AT_DATA([input.y],
525[[%token undef_id_tok const_id_tok
526
527%start CONST_DEC_PART
528\f
529%%
530CONST_DEC_PART:
531 CONST_DEC_LIST
532 ;
533
534CONST_DEC_LIST:
535 CONST_DEC
536 | CONST_DEC_LIST CONST_DEC
537 ;
538
539CONST_DEC:
540 { } undef_id_tok '=' const_id_tok ';'
541 ;
542%%
776209d6
AD
543]])
544
545AT_CHECK([bison -v input.y])
87675353 546AT_CHECK([cat input.output], 0,
776209d6 547[[Grammar
87675353 548
88bce5a2 549 0 $accept: CONST_DEC_PART $end
87675353 550
6b98e4b5 551 1 CONST_DEC_PART: CONST_DEC_LIST
87675353 552
6b98e4b5
AD
553 2 CONST_DEC_LIST: CONST_DEC
554 3 | CONST_DEC_LIST CONST_DEC
87675353 555
f91b1629 556 4 $@1: /* empty */
87675353 557
f91b1629 558 5 CONST_DEC: $@1 undef_id_tok '=' const_id_tok ';'
87675353
AD
559
560
776209d6 561Terminals, with rules where they appear
87675353 562
88bce5a2 563$end (0) 0
776209d6
AD
564';' (59) 5
565'=' (61) 5
566error (256)
007a50a4
AD
567undef_id_tok (258) 5
568const_id_tok (259) 5
87675353
AD
569
570
776209d6 571Nonterminals, with rules where they appear
87675353 572
88bce5a2 573$accept (7)
78d5bae9
AD
574 on left: 0
575CONST_DEC_PART (8)
576 on left: 1, on right: 0
577CONST_DEC_LIST (9)
776209d6 578 on left: 2 3, on right: 1 3
78d5bae9 579CONST_DEC (10)
776209d6 580 on left: 5, on right: 2 3
f91b1629 581$@1 (11)
776209d6 582 on left: 4, on right: 5
87675353
AD
583
584
776209d6 585state 0
87675353 586
88bce5a2 587 0 $accept: . CONST_DEC_PART $end
87675353 588
f91b1629 589 $default reduce using rule 4 ($@1)
87675353
AD
590
591 CONST_DEC_PART go to state 1
592 CONST_DEC_LIST go to state 2
593 CONST_DEC go to state 3
f91b1629 594 $@1 go to state 4
87675353
AD
595
596
776209d6 597state 1
87675353 598
88bce5a2 599 0 $accept: CONST_DEC_PART . $end
87675353 600
88bce5a2 601 $end shift, and go to state 5
87675353
AD
602
603
78d5bae9 604state 2
87675353 605
ce4ccb4b
AD
606 1 CONST_DEC_PART: CONST_DEC_LIST .
607 3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC
87675353 608
f91b1629 609 undef_id_tok reduce using rule 4 ($@1)
87675353
AD
610 $default reduce using rule 1 (CONST_DEC_PART)
611
612 CONST_DEC go to state 6
f91b1629 613 $@1 go to state 4
87675353
AD
614
615
78d5bae9 616state 3
87675353 617
ce4ccb4b 618 2 CONST_DEC_LIST: CONST_DEC .
87675353
AD
619
620 $default reduce using rule 2 (CONST_DEC_LIST)
621
622
776209d6 623state 4
87675353 624
f91b1629 625 5 CONST_DEC: $@1 . undef_id_tok '=' const_id_tok ';'
87675353
AD
626
627 undef_id_tok shift, and go to state 7
628
629
78d5bae9 630state 5
87675353 631
88bce5a2 632 0 $accept: CONST_DEC_PART $end .
87675353 633
e8832397 634 $default accept
87675353
AD
635
636
78d5bae9 637state 6
87675353 638
ce4ccb4b 639 3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC .
87675353
AD
640
641 $default reduce using rule 3 (CONST_DEC_LIST)
642
643
78d5bae9 644state 7
87675353 645
f91b1629 646 5 CONST_DEC: $@1 undef_id_tok . '=' const_id_tok ';'
87675353
AD
647
648 '=' shift, and go to state 8
649
650
78d5bae9 651state 8
87675353 652
f91b1629 653 5 CONST_DEC: $@1 undef_id_tok '=' . const_id_tok ';'
87675353
AD
654
655 const_id_tok shift, and go to state 9
656
657
78d5bae9 658state 9
87675353 659
f91b1629 660 5 CONST_DEC: $@1 undef_id_tok '=' const_id_tok . ';'
87675353
AD
661
662 ';' shift, and go to state 10
663
664
78d5bae9 665state 10
87675353 666
f91b1629 667 5 CONST_DEC: $@1 undef_id_tok '=' const_id_tok ';' .
87675353
AD
668
669 $default reduce using rule 5 (CONST_DEC)
776209d6
AD
670]])
671
672AT_CLEANUP
b9752825
AD
673
674
675## --------------- ##
676## Web2c Actions. ##
677## --------------- ##
678
679# The generation of the mapping `state -> action' was once wrong in
680# extremely specific situations. web2c.y exhibits this situation.
681# Below is a stripped version of the grammar. It looks like one can
682# simplify it further, but just don't: it is tuned to exhibit a bug,
683# which disapears when applying sane grammar transformations.
684#
685# It used to be wrong on yydefact only:
686#
d42cf844 687# static const yytype_uint8 yydefact[] =
b9752825
AD
688# {
689# - 2, 0, 1, 0, 0, 2, 3, 2, 5, 4,
690# + 2, 0, 1, 0, 0, 0, 3, 2, 5, 4,
691# 0, 0
692# };
693#
694# but let's check all the tables.
695
696
697AT_SETUP([Web2c Actions])
698
6b98e4b5
AD
699AT_KEYWORDS([report])
700
b9752825
AD
701AT_DATA([input.y],
702[[%%
703statement: struct_stat;
704struct_stat: /* empty. */ | if else;
705if: "if" "const" "then" statement;
706else: "else" statement;
707%%
708]])
709
b56471a6 710AT_CHECK([bison -v -o input.c input.y])
b9752825
AD
711
712# Check only the tables. We don't use --no-parser, because it is
713# still to be implemented in the experimental branch of Bison.
ce4ccb4b
AD
714[sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c]
715
716AT_CHECK([[cat tables.c]], 0,
d42cf844 717[[static const yytype_uint8 yytranslate[] =
b9752825
AD
718{
719 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
720 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
721 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
722 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
723 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
724 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
725 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
726 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
727 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
728 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
729 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
730 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
731 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
732 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
733 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
734 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
735 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
736 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
737 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
738 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
739 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
740 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
741 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
742 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
743 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
007a50a4
AD
744 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
745 5, 6
b9752825 746};
d42cf844 747static const yytype_uint8 yyprhs[] =
b9752825 748{
e7b8bef1 749 0, 0, 3, 5, 6, 9, 14
b9752825 750};
d42cf844 751static const yytype_int8 yyrhs[] =
b9752825 752{
e7b8bef1
AD
753 8, 0, -1, 9, -1, -1, 10, 11, -1, 3,
754 4, 5, 8, -1, 6, 8, -1
b9752825 755};
d42cf844 756static const yytype_uint8 yyrline[] =
b9752825 757{
e7b8bef1 758 0, 2, 2, 3, 3, 4, 5
b9752825
AD
759};
760static const char *const yytname[] =
761{
9e0876fb
PE
762 "$end", "error", "$undefined", "\"if\"", "\"const\"", "\"then\"",
763 "\"else\"", "$accept", "statement", "struct_stat", "if", "else", 0
b9752825 764};
d42cf844 765static const yytype_uint16 yytoknum[] =
b9752825 766{
3650b4b8 767 0, 256, 257, 258, 259, 260, 261
b9752825 768};
d42cf844 769static const yytype_uint8 yyr1[] =
b9752825 770{
e7b8bef1 771 0, 7, 8, 9, 9, 10, 11
b9752825 772};
d42cf844 773static const yytype_uint8 yyr2[] =
b9752825 774{
e7b8bef1 775 0, 2, 1, 0, 2, 4, 2
b9752825 776};
d42cf844 777static const yytype_uint8 yydefact[] =
b9752825 778{
e8832397 779 3, 0, 0, 2, 0, 0, 1, 3, 4, 3,
e7b8bef1 780 6, 5
b9752825 781};
d42cf844 782static const yytype_int8 yydefgoto[] =
b9752825 783{
e7b8bef1 784 -1, 2, 3, 4, 8
b9752825 785};
d42cf844 786static const yytype_int8 yypact[] =
b9752825 787{
12b0043a
AD
788 -2, -1, 4, -8, 0, 2, -8, -2, -8, -2,
789 -8, -8
b9752825 790};
d42cf844 791static const yytype_int8 yypgoto[] =
b9752825 792{
12b0043a 793 -8, -7, -8, -8, -8
b9752825 794};
d42cf844 795static const yytype_uint8 yytable[] =
b9752825 796{
e7b8bef1 797 10, 1, 11, 5, 6, 0, 7, 9
b9752825 798};
d42cf844 799static const yytype_int8 yycheck[] =
b9752825 800{
e7b8bef1 801 7, 3, 9, 4, 0, -1, 6, 5
b9752825 802};
d42cf844 803static const yytype_uint8 yystos[] =
5504898e
AD
804{
805 0, 3, 8, 9, 10, 4, 0, 6, 11, 5,
806 8, 8
807};
b9752825
AD
808]])
809
810AT_CLEANUP
22e304a6
AD
811
812
813## ------------------------- ##
814## yycheck Bound Violation. ##
815## ------------------------- ##
816
817
818# _AT_DATA_DANCER_Y(BISON-OPTIONS)
819# --------------------------------
820# The following grammar, taken from Andrew Suffield's GPL'd implementation
821# of DGMTP, the Dancer Generic Message Transport Protocol, used to violate
822# yycheck's bounds where issuing a verbose error message. Keep this test
823# so that possible bound checking compilers could check all the skeletons.
824m4_define([_AT_DATA_DANCER_Y],
825[AT_DATA_GRAMMAR([dancer.y],
826[%{
848dc439
PE
827static int yylex (AT_LALR1_CC_IF([int *], [void]));
828AT_LALR1_CC_IF([],
cf806753
PE
829[#include <stdlib.h>
830#include <stdio.h>
848dc439 831static void yyerror (const char *);])
22e304a6
AD
832%}
833$1
834%token ARROW INVALID NUMBER STRING DATA
835%defines
836%verbose
837%error-verbose
838/* Grammar follows */
839%%
840line: header body
841 ;
842
843header: '<' from ARROW to '>' type ':'
844 | '<' ARROW to '>' type ':'
845 | ARROW to type ':'
846 | type ':'
847 | '<' '>'
848 ;
849
850from: DATA
851 | STRING
852 | INVALID
853 ;
854
855to: DATA
856 | STRING
857 | INVALID
858 ;
859
860type: DATA
861 | STRING
862 | INVALID
863 ;
864
865body: /* empty */
866 | body member
867 ;
868
869member: STRING
870 | DATA
871 | '+' NUMBER
872 | '-' NUMBER
873 | NUMBER
874 | INVALID
875 ;
876%%
877AT_LALR1_CC_IF(
68e11668 878[/* A C++ error reporting function. */
22e304a6 879void
99880de5 880yy::parser::error (const location&, const std::string& m)
22e304a6 881{
efeed023 882 std::cerr << m << std::endl;
22e304a6
AD
883}
884
885int
99880de5 886yyparse ()
22e304a6 887{
99880de5 888 yy::parser parser;
fa7b79c0
PE
889#if YYDEBUG
890 parser.set_debug_level (YYDEBUG);
891#endif
22e304a6
AD
892 return parser.parse ();
893}
894],
895[static void
896yyerror (const char *s)
897{
898 fprintf (stderr, "%s\n", s);
899}])
900
901static int
848dc439 902yylex (AT_LALR1_CC_IF([int *lval], [void]))
22e304a6 903[{
cf806753 904 static int const tokens[] =
22e304a6
AD
905 {
906 ':', -1
907 };
cf806753 908 static size_t toknum;
848dc439 909 ]AT_LALR1_CC_IF([*lval = 0; /* Pacify GCC. */])[
cf806753
PE
910 if (! (toknum < sizeof tokens / sizeof *tokens))
911 abort ();
22e304a6
AD
912 return tokens[toknum++];
913}]
914
915int
916main (void)
917{
918 return yyparse ();
919}
920])
921])# _AT_DATA_DANCER_Y
922
923
924# AT_CHECK_DANCER(BISON-OPTIONS)
925# ------------------------------
926# Generate the grammar, compile it, run it.
927m4_define([AT_CHECK_DANCER],
928[AT_SETUP([Dancer $1])
929AT_BISON_OPTION_PUSHDEFS([$1])
930_AT_DATA_DANCER_Y([$1])
931AT_CHECK([bison -o dancer.c dancer.y])
07971983
PE
932AT_LALR1_CC_IF(
933 [AT_CHECK([bison -o dancer.cc dancer.y])
934 AT_COMPILE_CXX([dancer])],
935 [AT_CHECK([bison -o dancer.c dancer.y])
936 AT_COMPILE([dancer])])
22e304a6 937AT_PARSER_CHECK([./dancer], 1, [],
d5286af1 938[syntax error, unexpected ':'
22e304a6
AD
939])
940AT_BISON_OPTION_POPDEFS
941AT_CLEANUP
942])
943
944AT_CHECK_DANCER()
945AT_CHECK_DANCER([%glr-parser])
946AT_CHECK_DANCER([%skeleton "lalr1.cc"])
d6645148
PE
947
948
949## ------------------------------------------ ##
950## Diagnostic that expects two alternatives. ##
951## ------------------------------------------ ##
952
953
954# _AT_DATA_EXPECT2_Y(BISON-OPTIONS)
955# --------------------------------
956m4_define([_AT_DATA_EXPECT2_Y],
957[AT_DATA_GRAMMAR([expect2.y],
958[%{
959static int yylex (AT_LALR1_CC_IF([int *], [void]));
960AT_LALR1_CC_IF([],
961[#include <stdio.h>
c4bd5bf7 962#include <stdlib.h>
d6645148
PE
963static void yyerror (const char *);])
964%}
965$1
966%defines
967%error-verbose
968%token A 1000
969%token B
970
971%%
972program: /* empty */
973 | program e ';'
974 | program error ';';
975
976e: e '+' t | t;
977t: A | B;
978
979%%
980AT_LALR1_CC_IF(
981[/* A C++ error reporting function. */
982void
983yy::parser::error (const location&, const std::string& m)
984{
985 std::cerr << m << std::endl;
986}
987
988int
989yyparse ()
990{
991 yy::parser parser;
992 return parser.parse ();
993}
994],
995[static void
996yyerror (const char *s)
997{
998 fprintf (stderr, "%s\n", s);
999}])
1000
1001static int
1002yylex (AT_LALR1_CC_IF([int *lval], [void]))
1003[{
cf806753 1004 static int const tokens[] =
d6645148
PE
1005 {
1006 1000, '+', '+', -1
1007 };
cf806753 1008 static size_t toknum;
d6645148 1009 ]AT_LALR1_CC_IF([*lval = 0; /* Pacify GCC. */])[
cf806753
PE
1010 if (! (toknum < sizeof tokens / sizeof *tokens))
1011 abort ();
d6645148
PE
1012 return tokens[toknum++];
1013}]
1014
1015int
1016main (void)
1017{
1018 return yyparse ();
1019}
1020])
1021])# _AT_DATA_EXPECT2_Y
1022
1023
1024# AT_CHECK_EXPECT2(BISON-OPTIONS)
1025# ------------------------------
1026# Generate the grammar, compile it, run it.
1027m4_define([AT_CHECK_EXPECT2],
1028[AT_SETUP([Expecting two tokens $1])
1029AT_BISON_OPTION_PUSHDEFS([$1])
1030_AT_DATA_EXPECT2_Y([$1])
1031AT_CHECK([bison -o expect2.c expect2.y])
1032AT_LALR1_CC_IF(
1033 [AT_CHECK([bison -o expect2.cc expect2.y])
1034 AT_COMPILE_CXX([expect2])],
1035 [AT_CHECK([bison -o expect2.c expect2.y])
1036 AT_COMPILE([expect2])])
1037AT_PARSER_CHECK([./expect2], 1, [],
1038[syntax error, unexpected '+', expecting A or B
1039])
1040AT_BISON_OPTION_POPDEFS
1041AT_CLEANUP
1042])
1043
1044AT_CHECK_EXPECT2()
1045AT_CHECK_EXPECT2([%glr-parser])
1046AT_CHECK_EXPECT2([%skeleton "lalr1.cc"])
4210cd0b
JD
1047
1048
1049
1050## --------------------------------------------- ##
1051## Braced code in declaration in rules section. ##
1052## --------------------------------------------- ##
1053
1054AT_SETUP([Braced code in declaration in rules section])
1055
1056# Bison once mistook braced code in a declaration in the rules section to be a
1057# rule action.
1058
1059AT_DATA_GRAMMAR([input.y],
1060[[%{
1061#include <stdio.h>
381ecb06
JD
1062static void yyerror (char const *msg);
1063static int yylex (void);
4210cd0b
JD
1064%}
1065
1066%error-verbose
1067
1068%%
1069
1070start:
1071 {
1072 printf ("Bison would once convert this action to a midrule because of the"
1073 " subsequent braced code.\n");
1074 }
1075 ;
1076
1077%destructor { fprintf (stderr, "DESTRUCTOR\n"); } 'a';
1078%printer { fprintf (yyoutput, "PRINTER"); } 'a';
1079
1080%%
1081
381ecb06 1082static void
4210cd0b
JD
1083yyerror (char const *msg)
1084{
1085 fprintf (stderr, "%s\n", msg);
1086}
1087
381ecb06 1088static int
4210cd0b
JD
1089yylex (void)
1090{
1091 return 'a';
1092}
1093
1094int
1095main (void)
1096{
1097 yydebug = 1;
1098 return !yyparse ();
1099}
1100]])
1101
1102AT_CHECK([bison -t -o input.c input.y])
1103AT_COMPILE([input])
1104AT_PARSER_CHECK([./input], 0,
1105[[Bison would once convert this action to a midrule because of the subsequent braced code.
1106]],
1107[[Starting parse
1108Entering state 0
231ed89a 1109Reducing stack by rule 1 (line 20):
4210cd0b
JD
1110-> $$ = nterm start ()
1111Stack now 0
1112Entering state 1
1113Reading a token: Next token is token 'a' (PRINTER)
1114syntax error, unexpected 'a', expecting $end
1115Error: popping nterm start ()
1116Stack now 0
1117Cleanup: discarding lookahead token 'a' (PRINTER)
1118DESTRUCTOR
1119Stack now 0
1120]])
1121
1122AT_CLEANUP
965537bc
JD
1123
1124
1125
1126## --------------------------------- ##
1127## String alias declared after use. ##
1128## --------------------------------- ##
1129
1130AT_SETUP([String alias declared after use])
1131
1132# Bison once incorrectly asserted that the symbol number for either a token or
1133# its alias was the highest symbol number so far at the point of the alias
1134# declaration. That was true unless the declaration appeared after their first
6d0ef4ec 1135# uses and other tokens appeared in between.
965537bc
JD
1136
1137AT_DATA([input.y],
1138[[%%
1139start: 'a' "A" 'b';
1140%token 'a' "A";
1141]])
1142
1143AT_CHECK([bison -t -o input.c input.y])
1144
1145AT_CLEANUP