]> git.saurik.com Git - bison.git/blame - tests/regression.at
Credit Satya for the graphviz change.
[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
AD
254
255 1 @1: /* empty */
256
257 2 expr: 'a' @1 'b'
258
259 3 @2: /* empty */
260
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
279@1 (8)
2ca209c1 280 on left: 1, on right: 2
b365aa05 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
87675353 291 $default reduce using rule 3 (@2)
2ca209c1 292
87675353
AD
293 expr go to state 2
294 @2 go to state 3
2ca209c1
AD
295
296
297state 1
298
ce4ccb4b 299 2 expr: 'a' . @1 'b'
2ca209c1 300
87675353 301 $default reduce using rule 1 (@1)
2ca209c1 302
87675353 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
ce4ccb4b 315 4 expr: @2 . 'c'
2ca209c1 316
87675353 317 'c' shift, and go to state 6
2ca209c1
AD
318
319
320state 4
321
ce4ccb4b 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
ce4ccb4b 336 4 expr: @2 'c' .
b365aa05 337
87675353 338 $default reduce using rule 4 (expr)
2ca209c1
AD
339
340
341state 7
342
ce4ccb4b 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
6b98e4b5 556 4 @1: /* empty */
87675353 557
6b98e4b5 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
78d5bae9 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
AD
588
589 $default reduce using rule 4 (@1)
590
591 CONST_DEC_PART go to state 1
592 CONST_DEC_LIST go to state 2
593 CONST_DEC go to state 3
594 @1 go to state 4
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
AD
608
609 undef_id_tok reduce using rule 4 (@1)
610 $default reduce using rule 1 (CONST_DEC_PART)
611
612 CONST_DEC go to state 6
613 @1 go to state 4
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
ce4ccb4b 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
ce4ccb4b 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
ce4ccb4b 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
ce4ccb4b 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
ce4ccb4b 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>
962static void yyerror (const char *);])
963%}
964$1
965%defines
966%error-verbose
967%token A 1000
968%token B
969
970%%
971program: /* empty */
972 | program e ';'
973 | program error ';';
974
975e: e '+' t | t;
976t: A | B;
977
978%%
979AT_LALR1_CC_IF(
980[/* A C++ error reporting function. */
981void
982yy::parser::error (const location&, const std::string& m)
983{
984 std::cerr << m << std::endl;
985}
986
987int
988yyparse ()
989{
990 yy::parser parser;
991 return parser.parse ();
992}
993],
994[static void
995yyerror (const char *s)
996{
997 fprintf (stderr, "%s\n", s);
998}])
999
1000static int
1001yylex (AT_LALR1_CC_IF([int *lval], [void]))
1002[{
cf806753 1003 static int const tokens[] =
d6645148
PE
1004 {
1005 1000, '+', '+', -1
1006 };
cf806753 1007 static size_t toknum;
d6645148 1008 ]AT_LALR1_CC_IF([*lval = 0; /* Pacify GCC. */])[
cf806753
PE
1009 if (! (toknum < sizeof tokens / sizeof *tokens))
1010 abort ();
d6645148
PE
1011 return tokens[toknum++];
1012}]
1013
1014int
1015main (void)
1016{
1017 return yyparse ();
1018}
1019])
1020])# _AT_DATA_EXPECT2_Y
1021
1022
1023# AT_CHECK_EXPECT2(BISON-OPTIONS)
1024# ------------------------------
1025# Generate the grammar, compile it, run it.
1026m4_define([AT_CHECK_EXPECT2],
1027[AT_SETUP([Expecting two tokens $1])
1028AT_BISON_OPTION_PUSHDEFS([$1])
1029_AT_DATA_EXPECT2_Y([$1])
1030AT_CHECK([bison -o expect2.c expect2.y])
1031AT_LALR1_CC_IF(
1032 [AT_CHECK([bison -o expect2.cc expect2.y])
1033 AT_COMPILE_CXX([expect2])],
1034 [AT_CHECK([bison -o expect2.c expect2.y])
1035 AT_COMPILE([expect2])])
1036AT_PARSER_CHECK([./expect2], 1, [],
1037[syntax error, unexpected '+', expecting A or B
1038])
1039AT_BISON_OPTION_POPDEFS
1040AT_CLEANUP
1041])
1042
1043AT_CHECK_EXPECT2()
1044AT_CHECK_EXPECT2([%glr-parser])
1045AT_CHECK_EXPECT2([%skeleton "lalr1.cc"])
4210cd0b
JD
1046
1047
1048
1049## --------------------------------------------- ##
1050## Braced code in declaration in rules section. ##
1051## --------------------------------------------- ##
1052
1053AT_SETUP([Braced code in declaration in rules section])
1054
1055# Bison once mistook braced code in a declaration in the rules section to be a
1056# rule action.
1057
1058AT_DATA_GRAMMAR([input.y],
1059[[%{
1060#include <stdio.h>
381ecb06
JD
1061static void yyerror (char const *msg);
1062static int yylex (void);
4210cd0b
JD
1063%}
1064
1065%error-verbose
1066
1067%%
1068
1069start:
1070 {
1071 printf ("Bison would once convert this action to a midrule because of the"
1072 " subsequent braced code.\n");
1073 }
1074 ;
1075
1076%destructor { fprintf (stderr, "DESTRUCTOR\n"); } 'a';
1077%printer { fprintf (yyoutput, "PRINTER"); } 'a';
1078
1079%%
1080
381ecb06 1081static void
4210cd0b
JD
1082yyerror (char const *msg)
1083{
1084 fprintf (stderr, "%s\n", msg);
1085}
1086
381ecb06 1087static int
4210cd0b
JD
1088yylex (void)
1089{
1090 return 'a';
1091}
1092
1093int
1094main (void)
1095{
1096 yydebug = 1;
1097 return !yyparse ();
1098}
1099]])
1100
1101AT_CHECK([bison -t -o input.c input.y])
1102AT_COMPILE([input])
1103AT_PARSER_CHECK([./input], 0,
1104[[Bison would once convert this action to a midrule because of the subsequent braced code.
1105]],
1106[[Starting parse
1107Entering state 0
1108Reducing stack by rule 1 (line 22):
1109-> $$ = nterm start ()
1110Stack now 0
1111Entering state 1
1112Reading a token: Next token is token 'a' (PRINTER)
1113syntax error, unexpected 'a', expecting $end
1114Error: popping nterm start ()
1115Stack now 0
1116Cleanup: discarding lookahead token 'a' (PRINTER)
1117DESTRUCTOR
1118Stack now 0
1119]])
1120
1121AT_CLEANUP
965537bc
JD
1122
1123
1124
1125## --------------------------------- ##
1126## String alias declared after use. ##
1127## --------------------------------- ##
1128
1129AT_SETUP([String alias declared after use])
1130
1131# Bison once incorrectly asserted that the symbol number for either a token or
1132# its alias was the highest symbol number so far at the point of the alias
1133# declaration. That was true unless the declaration appeared after their first
6d0ef4ec 1134# uses and other tokens appeared in between.
965537bc
JD
1135
1136AT_DATA([input.y],
1137[[%%
1138start: 'a' "A" 'b';
1139%token 'a' "A";
1140]])
1141
1142AT_CHECK([bison -t -o input.c input.y])
1143
1144AT_CLEANUP