]> git.saurik.com Git - bison.git/blame - tests/regression.at
* src/bison.simple (YYSIZE_T, YYSTACK_ALLOC, YYSTACK_FREE):
[bison.git] / tests / regression.at
CommitLineData
342b8b6e
AD
1# Bison Regressions. -*- Autotest -*-
2# Copyright 2001 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
AD
20
21## ------------------ ##
22## Duplicate string. ##
23## ------------------ ##
24
25
26AT_SETUP([Duplicate string])
27
28AT_DATA([duplicate.y],
29[[/* `Bison -v' used to dump core when two tokens are defined with the same
30 string, as LE and GE below. */
31
32%token NUM
33%token LE "<="
34%token GE "<="
35
36%%
37exp: '(' exp ')' | NUM ;
38%%
39]])
40
41AT_CHECK([bison -v duplicate.y -o duplicate.c], 0, ignore, ignore)
42
d803322e 43AT_CLEANUP
c95f2d78
AD
44
45
ba9dda1a
AD
46## ------------------------- ##
47## Unresolved SR Conflicts. ##
48## ------------------------- ##
0df87bb6 49
ba9dda1a 50AT_SETUP([Unresolved SR Conflicts])
0df87bb6
AD
51
52AT_DATA([input.y],
53[[%token NUM OP
54%%
55exp: exp OP exp | NUM;
56]])
57
58AT_CHECK([bison input.y -o input.c -v], 0, [],
59[input.y contains 1 shift/reduce conflict.
60])
61
62# Check the contents of the report.
63AT_CHECK([cat input.output], [],
64[[State 4 contains 1 shift/reduce conflict.
65
d2d1b42b 66
0df87bb6
AD
67Grammar
68
b29b2ed5
AD
69 Number, Line, Rule
70 1 3 exp -> exp OP exp
71 2 3 exp -> NUM
0df87bb6 72
d2d1b42b 73
0df87bb6
AD
74Terminals, with rules where they appear
75
76$ (-1)
77error (256)
78NUM (257) 2
79OP (258) 1
80
d2d1b42b 81
0df87bb6
AD
82Nonterminals, with rules where they appear
83
84exp (5)
85 on left: 1 2, on right: 1
86
87
88state 0
89
90 NUM shift, and go to state 1
91
92 exp go to state 2
93
94
95
96state 1
97
98 exp -> NUM . (rule 2)
99
100 $default reduce using rule 2 (exp)
101
102
103
104state 2
105
106 exp -> exp . OP exp (rule 1)
107
2e729273 108 $ shift, and go to state 5
0df87bb6
AD
109 OP shift, and go to state 3
110
111
112
113state 3
114
115 exp -> exp OP . exp (rule 1)
116
117 NUM shift, and go to state 1
118
119 exp go to state 4
120
121
122
123state 4
124
125 exp -> exp . OP exp (rule 1)
126 exp -> exp OP exp . (rule 1)
127
128 OP shift, and go to state 3
129
c73a41af
AD
130 OP [reduce using rule 1 (exp)]
131 $default reduce using rule 1 (exp)
132
0df87bb6
AD
133
134
135state 5
136
2e729273 137 $ shift, and go to state 6
0df87bb6
AD
138
139
140
ba9dda1a
AD
141state 6
142
143 $default accept
d2d1b42b
AD
144
145
ba9dda1a
AD
146]])
147
d803322e 148AT_CLEANUP
ba9dda1a
AD
149
150
151## --------------------- ##
152## Solved SR Conflicts. ##
153## --------------------- ##
154
155AT_SETUP([Solved SR Conflicts])
156
157AT_DATA([input.y],
158[[%token NUM OP
159%right OP
160%%
161exp: exp OP exp | NUM;
162]])
163
164AT_CHECK([bison input.y -o input.c -v], 0, [], [])
165
166# Check the contents of the report.
167AT_CHECK([cat input.output], [],
168[[Conflict in state 4 between rule 1 and token OP resolved as shift.
169
d2d1b42b 170
ba9dda1a
AD
171Grammar
172
b29b2ed5
AD
173 Number, Line, Rule
174 1 4 exp -> exp OP exp
175 2 4 exp -> NUM
ba9dda1a 176
d2d1b42b 177
ba9dda1a
AD
178Terminals, with rules where they appear
179
180$ (-1)
181error (256)
182NUM (257) 2
183OP (258) 1
184
d2d1b42b 185
ba9dda1a
AD
186Nonterminals, with rules where they appear
187
188exp (5)
189 on left: 1 2, on right: 1
190
191
192state 0
193
194 NUM shift, and go to state 1
195
196 exp go to state 2
197
198
199
200state 1
201
202 exp -> NUM . (rule 2)
203
204 $default reduce using rule 2 (exp)
205
206
207
208state 2
209
210 exp -> exp . OP exp (rule 1)
211
2e729273 212 $ shift, and go to state 5
ba9dda1a
AD
213 OP shift, and go to state 3
214
215
216
217state 3
218
219 exp -> exp OP . exp (rule 1)
220
221 NUM shift, and go to state 1
222
223 exp go to state 4
224
225
226
227state 4
228
229 exp -> exp . OP exp (rule 1)
230 exp -> exp OP exp . (rule 1)
231
232 OP shift, and go to state 3
233
234 $default reduce using rule 1 (exp)
235
236
237
238state 5
239
2e729273 240 $ shift, and go to state 6
ba9dda1a
AD
241
242
243
0df87bb6
AD
244state 6
245
246 $default accept
d2d1b42b
AD
247
248
0df87bb6
AD
249]])
250
d803322e 251AT_CLEANUP
0df87bb6 252
c95f2d78 253
7da99ede 254
2ca209c1
AD
255
256## ------------------- ##
257## Rule Line Numbers. ##
258## ------------------- ##
259
260AT_SETUP([Rule Line Numbers])
261
262AT_DATA([input.y],
263[[%%
264expr:
265'a'
266
267{
268
269}
270
271'b'
272
273{
274
275}
276
277|
278
279
280{
281
282
283}
284
285'c'
286
287{
288
289}
290]])
291
292AT_CHECK([bison input.y -o input.c -v], 0, [], [])
293
294# Check the contents of the report.
295AT_CHECK([cat input.output], [],
d2d1b42b 296[[Grammar
2ca209c1
AD
297
298 Number, Line, Rule
299 1 2 @1 -> /* empty */
300 2 2 expr -> 'a' @1 'b'
301 3 15 @2 -> /* empty */
302 4 15 expr -> @2 'c'
303
d2d1b42b 304
2ca209c1
AD
305Terminals, with rules where they appear
306
307$ (-1)
308'a' (97) 2
309'b' (98) 2
310'c' (99) 4
311error (256)
312
d2d1b42b 313
2ca209c1
AD
314Nonterminals, with rules where they appear
315
316expr (6)
317 on left: 2 4
318@1 (7)
319 on left: 1, on right: 2
320@2 (8)
321 on left: 3, on right: 4
322
323
324state 0
325
326 'a' shift, and go to state 1
327
328 $default reduce using rule 3 (@2)
329
330 expr go to state 6
331 @2 go to state 2
332
333
334
335state 1
336
337 expr -> 'a' . @1 'b' (rule 2)
338
339 $default reduce using rule 1 (@1)
340
341 @1 go to state 3
342
343
344
345state 2
346
347 expr -> @2 . 'c' (rule 4)
348
349 'c' shift, and go to state 4
350
351
352
353state 3
354
355 expr -> 'a' @1 . 'b' (rule 2)
356
357 'b' shift, and go to state 5
358
359
360
361state 4
362
363 expr -> @2 'c' . (rule 4)
364
365 $default reduce using rule 4 (expr)
366
367
368
369state 5
370
371 expr -> 'a' @1 'b' . (rule 2)
372
373 $default reduce using rule 2 (expr)
374
375
376
377state 6
378
2e729273 379 $ shift, and go to state 7
2ca209c1
AD
380
381
382
383state 7
384
2ca209c1 385 $default accept
d2d1b42b
AD
386
387
2ca209c1
AD
388]])
389
390AT_CLEANUP
391
392
393
7da99ede
AD
394## -------------------- ##
395## %expect not enough. ##
396## -------------------- ##
397
398AT_SETUP([%expect not enough])
399
400AT_DATA([input.y],
401[[%token NUM OP
402%expect 0
403%%
404exp: exp OP exp | NUM;
405]])
406
407AT_CHECK([bison input.y -o input.c], 1, [],
408[input.y contains 1 shift/reduce conflict.
409expected 0 shift/reduce conflicts
410])
d803322e 411AT_CLEANUP
7da99ede
AD
412
413
414## --------------- ##
415## %expect right. ##
416## --------------- ##
417
418AT_SETUP([%expect right])
419
420AT_DATA([input.y],
421[[%token NUM OP
422%expect 1
423%%
424exp: exp OP exp | NUM;
425]])
426
a034c8b8 427AT_CHECK([bison input.y -o input.c], 0)
d803322e 428AT_CLEANUP
7da99ede
AD
429
430
431## ------------------ ##
432## %expect too much. ##
433## ------------------ ##
434
435AT_SETUP([%expect too much])
436
437AT_DATA([input.y],
438[[%token NUM OP
439%expect 2
440%%
441exp: exp OP exp | NUM;
442]])
443
444AT_CHECK([bison input.y -o input.c], 1, [],
445[input.y contains 1 shift/reduce conflict.
446expected 2 shift/reduce conflicts
447])
d803322e 448AT_CLEANUP
7da99ede
AD
449
450
cd5aafcf
AD
451## ---------------------- ##
452## Mixing %token styles. ##
453## ---------------------- ##
454
455
456AT_SETUP([Mixing %token styles])
457
458# Taken from the documentation.
459AT_DATA([input.y],
460[[%token <operator> OR "||"
461%token <operator> LE 134 "<="
462%left OR "<="
463%%
464exp: ;
465%%
466]])
467
468AT_CHECK([bison -v input.y -o input.c], 0, ignore, ignore)
469
d803322e 470AT_CLEANUP
cd5aafcf
AD
471
472
473
c95f2d78
AD
474## ---------------------- ##
475## %union and --defines. ##
476## ---------------------- ##
477
478
479AT_SETUP([%union and --defines])
480
481AT_DATA([union.y],
482[%union
483{
484 int integer;
485 char *string ;
486}
487%%
488exp: {};
489])
490
491AT_CHECK([bison --defines union.y])
492
d803322e 493AT_CLEANUP
342b8b6e
AD
494
495
496## --------------------------------------- ##
497## Duplicate '/' in C comments in %union ##
498## --------------------------------------- ##
499
500
501AT_SETUP([%union and C comments])
502
503AT_DATA([union-comment.y],
504[%union
505{
506 /* The int. */ int integer;
507 /* The string. */ char *string ;
508}
509%%
510exp: {};
511])
512
513AT_CHECK([bison union-comment.y])
514AT_CHECK([fgrep '//*' union-comment.tab.c], [1], [])
515
d803322e 516AT_CLEANUP
342b8b6e
AD
517
518
561f9a30
AD
519## ----------------- ##
520## Invalid input 1. ##
521## ----------------- ##
522
523
524AT_SETUP([Invalid input: 1])
525
526AT_DATA([input.y],
527[[%%
528?
529]])
530
531AT_CHECK([bison input.y], [1], [],
e0c40012 532[[input.y:2: invalid input: `?'
561f9a30 533input.y:3: fatal error: no rules in the input grammar
e0c40012 534]])
561f9a30
AD
535
536AT_CLEANUP
537
538
539## ----------------- ##
540## Invalid input 2. ##
541## ----------------- ##
542
543
544AT_SETUP([Invalid input: 2])
545
546AT_DATA([input.y],
547[[%%
548default: 'a' }
549]])
550
551AT_CHECK([bison input.y], [1], [],
e0c40012
AD
552[[input.y:2: invalid input: `}'
553]])
554
555AT_CLEANUP
556
557
558
559## -------------------- ##
560## Invalid %directive. ##
561## -------------------- ##
562
563
564AT_SETUP([Invalid %directive])
565
566AT_DATA([input.y],
567[[%invalid
568]])
569
570AT_CHECK([bison input.y], [1], [],
571[[input.y:1: unrecognized: %invalid
572input.y:1: Skipping to next %
573input.y:2: fatal error: no input grammar
574]])
561f9a30
AD
575
576AT_CLEANUP
577
578
270a173c 579
342b8b6e
AD
580## --------------------- ##
581## Invalid CPP headers. ##
582## --------------------- ##
583
270a173c
AD
584# AT_TEST_CPP_GUARD_H([INPUT-FILE-BASE)
585# -------------------------------------
586m4_define([AT_TEST_CPP_GUARD_H],
587[AT_SETUP([Invalid CPP guards: $1])
342b8b6e 588
d803322e
AD
589# Possibly create inner directories.
590dirname=`AS_DIRNAME([$1])`
270a173c 591AS_MKDIR_P([$dirname])
342b8b6e 592
270a173c 593AT_DATA([$1.y],
342b8b6e
AD
594[%%
595dummy:
596])
597
270a173c 598AT_CHECK([bison --defines=$1.h $1.y])
342b8b6e 599
270a173c
AD
600# CPP should be happy with it.
601AT_CHECK([$CC -E $1.h], 0, [ignore])
602
d803322e 603AT_CLEANUP
270a173c 604])
342b8b6e 605
270a173c
AD
606AT_TEST_CPP_GUARD_H([input/input])
607AT_TEST_CPP_GUARD_H([9foo])