]> git.saurik.com Git - bison.git/blame_incremental - tests/regression.at
Typo.
[bison.git] / tests / regression.at
... / ...
CommitLineData
1# Bison Regressions. -*- Autotest -*-
2# Copyright 2001 Free Software Foundation, Inc.
3
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.
8
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.
13
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.
18
19AT_BANNER([[Regression tests.]])
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
43AT_CLEANUP
44
45
46## ------------------------- ##
47## Unresolved SR Conflicts. ##
48## ------------------------- ##
49
50AT_SETUP([Unresolved SR Conflicts])
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
66
67Grammar
68
69 Number, Line, Rule
70 1 3 exp -> exp OP exp
71 2 3 exp -> NUM
72
73
74Terminals, with rules where they appear
75
76$ (-1)
77error (256)
78NUM (257) 2
79OP (258) 1
80
81
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
108 $ shift, and go to state 5
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
130 OP [reduce using rule 1 (exp)]
131 $default reduce using rule 1 (exp)
132
133
134
135state 5
136
137 $ shift, and go to state 6
138
139
140
141state 6
142
143 $default accept
144
145
146]])
147
148AT_CLEANUP
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
170
171Grammar
172
173 Number, Line, Rule
174 1 4 exp -> exp OP exp
175 2 4 exp -> NUM
176
177
178Terminals, with rules where they appear
179
180$ (-1)
181error (256)
182NUM (257) 2
183OP (258) 1
184
185
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
212 $ shift, and go to state 5
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
240 $ shift, and go to state 6
241
242
243
244state 6
245
246 $default accept
247
248
249]])
250
251AT_CLEANUP
252
253
254
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], [],
296[[Grammar
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
304
305Terminals, with rules where they appear
306
307$ (-1)
308'a' (97) 2
309'b' (98) 2
310'c' (99) 4
311error (256)
312
313
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
379 $ shift, and go to state 7
380
381
382
383state 7
384
385 $default accept
386
387
388]])
389
390AT_CLEANUP
391
392
393
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])
411AT_CLEANUP
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
427AT_CHECK([bison input.y -o input.c], 0)
428AT_CLEANUP
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])
448AT_CLEANUP
449
450
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
470AT_CLEANUP
471
472
473
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
493AT_CLEANUP
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
516AT_CLEANUP
517
518
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], [],
532[[input.y:2: invalid input: `?'
533input.y:3: fatal error: no rules in the input grammar
534]])
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], [],
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]])
575
576AT_CLEANUP
577
578
579
580## --------------------- ##
581## Invalid CPP headers. ##
582## --------------------- ##
583
584# AT_TEST_CPP_GUARD_H([INPUT-FILE-BASE)
585# -------------------------------------
586m4_define([AT_TEST_CPP_GUARD_H],
587[AT_SETUP([Invalid CPP guards: $1])
588
589# Possibly create inner directories.
590dirname=`AS_DIRNAME([$1])`
591AS_MKDIR_P([$dirname])
592
593AT_DATA([$1.y],
594[%%
595dummy:
596])
597
598AT_CHECK([bison --defines=$1.h $1.y])
599
600# CPP should be happy with it.
601AT_CHECK([$CC -E $1.h], 0, [ignore])
602
603AT_CLEANUP
604])
605
606AT_TEST_CPP_GUARD_H([input/input])
607AT_TEST_CPP_GUARD_H([9foo])