]> git.saurik.com Git - bison.git/blame - tests/regression.at
* NEWS: Bison-generated C parsers no longer quote literal strings
[bison.git] / tests / regression.at
CommitLineData
342b8b6e 1# Bison Regressions. -*- Autotest -*-
4f136612 2# Copyright (C) 2001, 2002, 2003, 2004, 2005 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
9501dc6e 32AT_DATA_GRAMMAR([input.y],
69078d4b
AD
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
b56471a6 53AT_CHECK([bison -o input.c input.y])
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
b56471a6 75AT_CHECK([bison -v -o input.c input.y])
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
b56471a6 102AT_CHECK([bison -v -o input.c input.y], 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
b56471a6 147AT_CHECK([bison -o input.c -v input.y])
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
b56471a6 269AT_CHECK([bison -v -o input.c input.y])
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 286%&
2dfbfc12 287%a-does-not-exist
29ae55f1 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: `&'
2dfbfc12 297input.y:5.1-17: invalid directive: `%a-does-not-exist'
e9955c83
AD
298input.y:6.1: invalid character: `%'
299input.y:6.2: invalid character: `-'
2115939b 300input.y:7.1-8.0: missing `%}' at end of file
e0c40012 301]])
561f9a30
AD
302
303AT_CLEANUP
304
305
270a173c 306
b87f8b21
AD
307## ------------------- ##
308## Token definitions. ##
309## ------------------- ##
310
311
312AT_SETUP([Token definitions])
313
314# Bison managed, when fed with `%token 'f' "f"' to #define 'f'!
9501dc6e 315AT_DATA_GRAMMAR([input.y],
db7c8e9a 316[%{
ca407bdf 317#include <stdio.h>
db7c8e9a
AD
318void yyerror (const char *s);
319int yylex (void);
320%}
ca407bdf
PE
321[%error-verbose
322%token MYEOF 0 "end of file"
b87f8b21 323%token 'a' "a"
4f136612
PE
324%token B_TOKEN "b"
325%token C_TOKEN 'c'
326%token 'd' D_TOKEN
72f000b0 327%token SPECIAL "\\\'\?\"\n\t??!"
b87f8b21 328%%
72f000b0 329exp: "a" "\\\'\?\"\n\t??!";
ca407bdf
PE
330%%
331void
332yyerror (char const *s)
333{
334 fprintf (stderr, "%s\n", s);
335}
336
337int
338yylex (void)
339{
340 return SPECIAL;
341}
342
343int
344main (void)
345{
346 return yyparse ();
347}
b87f8b21
AD
348]])
349
b56471a6 350AT_CHECK([bison -o input.c input.y])
ca407bdf
PE
351AT_COMPILE([input])
352AT_PARSER_CHECK([./input], 1, [],
72f000b0
PE
353[syntax error, unexpected \'?"
354 ??!, expecting a
ca407bdf 355])
b87f8b21
AD
356AT_CLEANUP
357
358
359
eb714592
AD
360## -------------------- ##
361## Characters Escapes. ##
362## -------------------- ##
363
364
365AT_SETUP([Characters Escapes])
366
9501dc6e 367AT_DATA_GRAMMAR([input.y],
eb714592
AD
368[%{
369void yyerror (const char *s);
370int yylex (void);
371%}
372[%%
373exp:
374 '\'' "\'"
375| '\"' "\""
376| '"' "'"
377;
378]])
9501dc6e 379# Pacify font-lock-mode: "
eb714592 380
b56471a6 381AT_CHECK([bison -o input.c input.y])
eb714592
AD
382AT_COMPILE([input.o], [-c input.c])
383AT_CLEANUP
384
385
386
b9752825
AD
387## -------------- ##
388## Web2c Report. ##
389## -------------- ##
776209d6
AD
390
391# The generation of the reduction was once wrong in Bison, and made it
392# miss some reductions. In the following test case, the reduction on
393# `undef_id_tok' in state 1 was missing. This is stripped down from
394# the actual web2c.y.
395
b9752825 396AT_SETUP([Web2c Report])
776209d6 397
6b98e4b5
AD
398AT_KEYWORDS([report])
399
776209d6
AD
400AT_DATA([input.y],
401[[%token undef_id_tok const_id_tok
402
403%start CONST_DEC_PART
404\f
405%%
406CONST_DEC_PART:
407 CONST_DEC_LIST
408 ;
409
410CONST_DEC_LIST:
411 CONST_DEC
412 | CONST_DEC_LIST CONST_DEC
413 ;
414
415CONST_DEC:
416 { } undef_id_tok '=' const_id_tok ';'
417 ;
418%%
776209d6
AD
419]])
420
421AT_CHECK([bison -v input.y])
87675353 422AT_CHECK([cat input.output], 0,
776209d6 423[[Grammar
87675353 424
88bce5a2 425 0 $accept: CONST_DEC_PART $end
87675353 426
6b98e4b5 427 1 CONST_DEC_PART: CONST_DEC_LIST
87675353 428
6b98e4b5
AD
429 2 CONST_DEC_LIST: CONST_DEC
430 3 | CONST_DEC_LIST CONST_DEC
87675353 431
6b98e4b5 432 4 @1: /* empty */
87675353 433
6b98e4b5 434 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';'
87675353
AD
435
436
776209d6 437Terminals, with rules where they appear
87675353 438
88bce5a2 439$end (0) 0
776209d6
AD
440';' (59) 5
441'=' (61) 5
442error (256)
007a50a4
AD
443undef_id_tok (258) 5
444const_id_tok (259) 5
87675353
AD
445
446
776209d6 447Nonterminals, with rules where they appear
87675353 448
88bce5a2 449$accept (7)
78d5bae9
AD
450 on left: 0
451CONST_DEC_PART (8)
452 on left: 1, on right: 0
453CONST_DEC_LIST (9)
776209d6 454 on left: 2 3, on right: 1 3
78d5bae9 455CONST_DEC (10)
776209d6 456 on left: 5, on right: 2 3
78d5bae9 457@1 (11)
776209d6 458 on left: 4, on right: 5
87675353
AD
459
460
776209d6 461state 0
87675353 462
88bce5a2 463 0 $accept: . CONST_DEC_PART $end
87675353
AD
464
465 $default reduce using rule 4 (@1)
466
467 CONST_DEC_PART go to state 1
468 CONST_DEC_LIST go to state 2
469 CONST_DEC go to state 3
470 @1 go to state 4
471
472
776209d6 473state 1
87675353 474
88bce5a2 475 0 $accept: CONST_DEC_PART . $end
87675353 476
88bce5a2 477 $end shift, and go to state 5
87675353
AD
478
479
78d5bae9 480state 2
87675353 481
ce4ccb4b
AD
482 1 CONST_DEC_PART: CONST_DEC_LIST .
483 3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC
87675353
AD
484
485 undef_id_tok reduce using rule 4 (@1)
486 $default reduce using rule 1 (CONST_DEC_PART)
487
488 CONST_DEC go to state 6
489 @1 go to state 4
490
491
78d5bae9 492state 3
87675353 493
ce4ccb4b 494 2 CONST_DEC_LIST: CONST_DEC .
87675353
AD
495
496 $default reduce using rule 2 (CONST_DEC_LIST)
497
498
776209d6 499state 4
87675353 500
ce4ccb4b 501 5 CONST_DEC: @1 . undef_id_tok '=' const_id_tok ';'
87675353
AD
502
503 undef_id_tok shift, and go to state 7
504
505
78d5bae9 506state 5
87675353 507
88bce5a2 508 0 $accept: CONST_DEC_PART $end .
87675353 509
e8832397 510 $default accept
87675353
AD
511
512
78d5bae9 513state 6
87675353 514
ce4ccb4b 515 3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC .
87675353
AD
516
517 $default reduce using rule 3 (CONST_DEC_LIST)
518
519
78d5bae9 520state 7
87675353 521
ce4ccb4b 522 5 CONST_DEC: @1 undef_id_tok . '=' const_id_tok ';'
87675353
AD
523
524 '=' shift, and go to state 8
525
526
78d5bae9 527state 8
87675353 528
ce4ccb4b 529 5 CONST_DEC: @1 undef_id_tok '=' . const_id_tok ';'
87675353
AD
530
531 const_id_tok shift, and go to state 9
532
533
78d5bae9 534state 9
87675353 535
ce4ccb4b 536 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok . ';'
87675353
AD
537
538 ';' shift, and go to state 10
539
540
78d5bae9 541state 10
87675353 542
ce4ccb4b 543 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' .
87675353
AD
544
545 $default reduce using rule 5 (CONST_DEC)
776209d6
AD
546]])
547
548AT_CLEANUP
b9752825
AD
549
550
551## --------------- ##
552## Web2c Actions. ##
553## --------------- ##
554
555# The generation of the mapping `state -> action' was once wrong in
556# extremely specific situations. web2c.y exhibits this situation.
557# Below is a stripped version of the grammar. It looks like one can
558# simplify it further, but just don't: it is tuned to exhibit a bug,
559# which disapears when applying sane grammar transformations.
560#
561# It used to be wrong on yydefact only:
562#
779e7ceb 563# static const short int yydefact[] =
b9752825
AD
564# {
565# - 2, 0, 1, 0, 0, 2, 3, 2, 5, 4,
566# + 2, 0, 1, 0, 0, 0, 3, 2, 5, 4,
567# 0, 0
568# };
569#
570# but let's check all the tables.
571
572
573AT_SETUP([Web2c Actions])
574
6b98e4b5
AD
575AT_KEYWORDS([report])
576
b9752825
AD
577AT_DATA([input.y],
578[[%%
579statement: struct_stat;
580struct_stat: /* empty. */ | if else;
581if: "if" "const" "then" statement;
582else: "else" statement;
583%%
584]])
585
b56471a6 586AT_CHECK([bison -v -o input.c input.y])
b9752825
AD
587
588# Check only the tables. We don't use --no-parser, because it is
589# still to be implemented in the experimental branch of Bison.
ce4ccb4b
AD
590[sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c]
591
592AT_CHECK([[cat tables.c]], 0,
c0c9ea05 593[[static const unsigned char yytranslate[] =
b9752825
AD
594{
595 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
596 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
597 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
598 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
599 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
600 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
601 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
602 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
603 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
604 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
605 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
606 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
607 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
608 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
609 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
610 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
611 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
612 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
613 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
614 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
615 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
616 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
617 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
618 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
619 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
007a50a4
AD
620 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
621 5, 6
b9752825 622};
5df5f6d5 623static const unsigned char yyprhs[] =
b9752825 624{
e7b8bef1 625 0, 0, 3, 5, 6, 9, 14
b9752825 626};
7c78fa18 627static const yysigned_char yyrhs[] =
b9752825 628{
e7b8bef1
AD
629 8, 0, -1, 9, -1, -1, 10, 11, -1, 3,
630 4, 5, 8, -1, 6, 8, -1
b9752825 631};
5df5f6d5 632static const unsigned char yyrline[] =
b9752825 633{
e7b8bef1 634 0, 2, 2, 3, 3, 4, 5
b9752825
AD
635};
636static const char *const yytname[] =
637{
72f000b0
PE
638 "$end", "error", "$undefined", "if", "const", "then", "else", "$accept",
639 "statement", "struct_stat", "if", "else", 0
b9752825 640};
779e7ceb 641static const unsigned short int yytoknum[] =
b9752825 642{
3650b4b8 643 0, 256, 257, 258, 259, 260, 261
b9752825 644};
c0c9ea05 645static const unsigned char yyr1[] =
b9752825 646{
e7b8bef1 647 0, 7, 8, 9, 9, 10, 11
b9752825 648};
5df5f6d5 649static const unsigned char yyr2[] =
b9752825 650{
e7b8bef1 651 0, 2, 1, 0, 2, 4, 2
b9752825 652};
a762e609 653static const unsigned char yydefact[] =
b9752825 654{
e8832397 655 3, 0, 0, 2, 0, 0, 1, 3, 4, 3,
e7b8bef1 656 6, 5
b9752825 657};
7c78fa18 658static const yysigned_char yydefgoto[] =
b9752825 659{
e7b8bef1 660 -1, 2, 3, 4, 8
b9752825 661};
7c78fa18 662static const yysigned_char yypact[] =
b9752825 663{
12b0043a
AD
664 -2, -1, 4, -8, 0, 2, -8, -2, -8, -2,
665 -8, -8
b9752825 666};
7c78fa18 667static const yysigned_char yypgoto[] =
b9752825 668{
12b0043a 669 -8, -7, -8, -8, -8
b9752825 670};
a762e609 671static const unsigned char yytable[] =
b9752825 672{
e7b8bef1 673 10, 1, 11, 5, 6, 0, 7, 9
b9752825 674};
7c78fa18 675static const yysigned_char yycheck[] =
b9752825 676{
e7b8bef1 677 7, 3, 9, 4, 0, -1, 6, 5
b9752825 678};
5504898e
AD
679static const unsigned char yystos[] =
680{
681 0, 3, 8, 9, 10, 4, 0, 6, 11, 5,
682 8, 8
683};
b9752825
AD
684]])
685
686AT_CLEANUP
22e304a6
AD
687
688
689## ------------------------- ##
690## yycheck Bound Violation. ##
691## ------------------------- ##
692
693
694# _AT_DATA_DANCER_Y(BISON-OPTIONS)
695# --------------------------------
696# The following grammar, taken from Andrew Suffield's GPL'd implementation
697# of DGMTP, the Dancer Generic Message Transport Protocol, used to violate
698# yycheck's bounds where issuing a verbose error message. Keep this test
699# so that possible bound checking compilers could check all the skeletons.
700m4_define([_AT_DATA_DANCER_Y],
701[AT_DATA_GRAMMAR([dancer.y],
702[%{
848dc439
PE
703static int yylex (AT_LALR1_CC_IF([int *], [void]));
704AT_LALR1_CC_IF([],
22e304a6 705[#include <stdio.h>
848dc439 706static void yyerror (const char *);])
22e304a6
AD
707%}
708$1
709%token ARROW INVALID NUMBER STRING DATA
710%defines
711%verbose
712%error-verbose
713/* Grammar follows */
714%%
715line: header body
716 ;
717
718header: '<' from ARROW to '>' type ':'
719 | '<' ARROW to '>' type ':'
720 | ARROW to type ':'
721 | type ':'
722 | '<' '>'
723 ;
724
725from: DATA
726 | STRING
727 | INVALID
728 ;
729
730to: DATA
731 | STRING
732 | INVALID
733 ;
734
735type: DATA
736 | STRING
737 | INVALID
738 ;
739
740body: /* empty */
741 | body member
742 ;
743
744member: STRING
745 | DATA
746 | '+' NUMBER
747 | '-' NUMBER
748 | NUMBER
749 | INVALID
750 ;
751%%
752AT_LALR1_CC_IF(
68e11668 753[/* A C++ error reporting function. */
22e304a6 754void
99880de5 755yy::parser::error (const location&, const std::string& m)
22e304a6 756{
efeed023 757 std::cerr << m << std::endl;
22e304a6
AD
758}
759
760int
99880de5 761yyparse ()
22e304a6 762{
99880de5 763 yy::parser parser;
a3cb6248 764 parser.set_debug_level (!!YYDEBUG);
22e304a6
AD
765 return parser.parse ();
766}
767],
768[static void
769yyerror (const char *s)
770{
771 fprintf (stderr, "%s\n", s);
772}])
773
774static int
848dc439 775yylex (AT_LALR1_CC_IF([int *lval], [void]))
22e304a6
AD
776[{
777 static int toknum = 0;
778 int tokens[] =
779 {
780 ':', -1
781 };
848dc439 782 ]AT_LALR1_CC_IF([*lval = 0; /* Pacify GCC. */])[
22e304a6
AD
783 return tokens[toknum++];
784}]
785
786int
787main (void)
788{
789 return yyparse ();
790}
791])
792])# _AT_DATA_DANCER_Y
793
794
795# AT_CHECK_DANCER(BISON-OPTIONS)
796# ------------------------------
797# Generate the grammar, compile it, run it.
798m4_define([AT_CHECK_DANCER],
799[AT_SETUP([Dancer $1])
800AT_BISON_OPTION_PUSHDEFS([$1])
801_AT_DATA_DANCER_Y([$1])
802AT_CHECK([bison -o dancer.c dancer.y])
07971983
PE
803AT_LALR1_CC_IF(
804 [AT_CHECK([bison -o dancer.cc dancer.y])
805 AT_COMPILE_CXX([dancer])],
806 [AT_CHECK([bison -o dancer.c dancer.y])
807 AT_COMPILE([dancer])])
22e304a6 808AT_PARSER_CHECK([./dancer], 1, [],
d5286af1 809[syntax error, unexpected ':'
22e304a6
AD
810])
811AT_BISON_OPTION_POPDEFS
812AT_CLEANUP
813])
814
815AT_CHECK_DANCER()
816AT_CHECK_DANCER([%glr-parser])
817AT_CHECK_DANCER([%skeleton "lalr1.cc"])