]> git.saurik.com Git - bison.git/blame - tests/conflicts.at
Credit Satya for the graphviz change.
[bison.git] / tests / conflicts.at
CommitLineData
3c31a486 1# Exercising Bison on conflicts. -*- Autotest -*-
69363a9e 2
67fd79c4 3# Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3c31a486
AD
4
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; either version 2, or (at your option)
8# any later version.
9
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14
15# You should have received a copy of the GNU General Public License
16# along with this program; if not, write to the Free Software
0fb669f9
PE
17# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18# 02110-1301, USA.
3c31a486
AD
19
20AT_BANNER([[Conflicts.]])
21
22
643a5994
AD
23## ---------------- ##
24## S/R in initial. ##
25## ---------------- ##
26
27# I once hacked Bison in such a way that it lost its reductions on the
28# initial state (because it was confusing it with the last state). It
29# took me a while to strip down my failures to this simple case. So
30# make sure it finds the s/r conflict below.
31
32AT_SETUP([S/R in initial])
33
34AT_DATA([[input.y]],
35[[%expect 1
36%%
37exp: e 'e';
38e: 'e' | /* Nothing. */;
39]])
40
b56471a6 41AT_CHECK([bison -o input.c input.y], 0, [],
2bf21a83 42[[input.y:4.9: warning: rule never reduced because of conflicts: e: /* empty */
e8832397 43]])
643a5994
AD
44
45AT_CLEANUP
46
bc933ef1 47
3c31a486
AD
48## ------------------- ##
49## %nonassoc and eof. ##
50## ------------------- ##
51
52AT_SETUP([%nonassoc and eof])
53
9501dc6e 54AT_DATA_GRAMMAR([input.y],
3c31a486
AD
55[[
56%{
57#include <stdio.h>
6e26ca8c 58#include <stdlib.h>
cf806753 59#include <string.h>
1207eeac 60
3c31a486 61#define YYERROR_VERBOSE 1
1207eeac
AD
62static void
63yyerror (const char *msg)
64{
65 fprintf (stderr, "%s\n", msg);
1207eeac 66}
3c31a486
AD
67
68/* The current argument. */
cf806753 69static const char *input;
3c31a486
AD
70
71static int
72yylex (void)
73{
cf806753
PE
74 static size_t toknum;
75 if (! (toknum <= strlen (input)))
76 abort ();
77 return input[toknum++];
3c31a486
AD
78}
79
80%}
81
82%nonassoc '<' '>'
83
84%%
85expr: expr '<' expr
86 | expr '>' expr
87 | '0'
88 ;
89%%
90int
91main (int argc, const char *argv[])
92{
cf806753 93 input = argc <= 1 ? "" : argv[1];
3c31a486
AD
94 return yyparse ();
95}
96]])
97
98# Specify the output files to avoid problems on different file systems.
b56471a6 99AT_CHECK([bison -o input.c input.y])
1154cced 100AT_COMPILE([input])
3c31a486 101
1154cced 102AT_PARSER_CHECK([./input '0<0'])
3c31a486
AD
103# FIXME: This is an actual bug, but a new one, in the sense that
104# no one has ever spotted it! The messages are *wrong*: there should
105# be nothing there, it should be expected eof.
1154cced 106AT_PARSER_CHECK([./input '0<0<0'], [1], [],
6e649e65 107 [syntax error, unexpected '<', expecting '<' or '>'
3c31a486
AD
108])
109
1154cced
AD
110AT_PARSER_CHECK([./input '0>0'])
111AT_PARSER_CHECK([./input '0>0>0'], [1], [],
6e649e65 112 [syntax error, unexpected '>', expecting '<' or '>'
3c31a486
AD
113])
114
1154cced 115AT_PARSER_CHECK([./input '0<0>0'], [1], [],
6e649e65 116 [syntax error, unexpected '>', expecting '<' or '>'
3c31a486
AD
117])
118
119AT_CLEANUP
120
121
122
123## ------------------------- ##
124## Unresolved SR Conflicts. ##
125## ------------------------- ##
126
127AT_SETUP([Unresolved SR Conflicts])
128
6b98e4b5
AD
129AT_KEYWORDS([report])
130
3c31a486
AD
131AT_DATA([input.y],
132[[%token NUM OP
133%%
134exp: exp OP exp | NUM;
135]])
136
b56471a6 137AT_CHECK([bison -o input.c --report=all input.y], 0, [],
2c8ba4cd 138[input.y: conflicts: 1 shift/reduce
3c31a486
AD
139])
140
141# Check the contents of the report.
142AT_CHECK([cat input.output], [],
2c8ba4cd 143[[State 5 conflicts: 1 shift/reduce
3c31a486
AD
144
145
146Grammar
147
88bce5a2 148 0 $accept: exp $end
6b98e4b5
AD
149
150 1 exp: exp OP exp
151 2 | NUM
3c31a486
AD
152
153
154Terminals, with rules where they appear
155
88bce5a2 156$end (0) 0
3c31a486 157error (256)
007a50a4
AD
158NUM (258) 2
159OP (259) 1
3c31a486
AD
160
161
162Nonterminals, with rules where they appear
163
88bce5a2 164$accept (5)
3c31a486
AD
165 on left: 0
166exp (6)
167 on left: 1 2, on right: 0 1
168
169
170state 0
171
88bce5a2 172 0 $accept: . exp $end
ce4ccb4b
AD
173 1 exp: . exp OP exp
174 2 | . NUM
643a5994 175
87675353 176 NUM shift, and go to state 1
3c31a486 177
87675353 178 exp go to state 2
3c31a486
AD
179
180
181state 1
182
ce4ccb4b 183 2 exp: NUM .
3c31a486 184
87675353 185 $default reduce using rule 2 (exp)
3c31a486
AD
186
187
188state 2
189
88bce5a2 190 0 $accept: exp . $end
ce4ccb4b 191 1 exp: exp . OP exp
3c31a486 192
88bce5a2
AD
193 $end shift, and go to state 3
194 OP shift, and go to state 4
3c31a486
AD
195
196
197state 3
198
88bce5a2 199 0 $accept: exp $end .
3c31a486 200
e8832397 201 $default accept
3c31a486
AD
202
203
204state 4
205
ce4ccb4b
AD
206 1 exp: . exp OP exp
207 1 | exp OP . exp
208 2 | . NUM
3c31a486 209
87675353 210 NUM shift, and go to state 1
3c31a486 211
87675353 212 exp go to state 5
3c31a486
AD
213
214
215state 5
216
88bce5a2
AD
217 1 exp: exp . OP exp [$end, OP]
218 1 | exp OP exp . [$end, OP]
3c31a486 219
87675353 220 OP shift, and go to state 4
3c31a486 221
87675353
AD
222 OP [reduce using rule 1 (exp)]
223 $default reduce using rule 1 (exp)
3c31a486
AD
224]])
225
226AT_CLEANUP
227
228
3c31a486 229
ce4ccb4b
AD
230## ----------------------- ##
231## Resolved SR Conflicts. ##
232## ----------------------- ##
233
234AT_SETUP([Resolved SR Conflicts])
3c31a486 235
6b98e4b5
AD
236AT_KEYWORDS([report])
237
3c31a486
AD
238AT_DATA([input.y],
239[[%token NUM OP
ce4ccb4b 240%left OP
3c31a486
AD
241%%
242exp: exp OP exp | NUM;
243]])
244
b56471a6 245AT_CHECK([bison -o input.c --report=all input.y])
3c31a486
AD
246
247# Check the contents of the report.
248AT_CHECK([cat input.output], [],
ce4ccb4b 249[[Grammar
3c31a486 250
88bce5a2 251 0 $accept: exp $end
6b98e4b5
AD
252
253 1 exp: exp OP exp
254 2 | NUM
3c31a486
AD
255
256
257Terminals, with rules where they appear
258
88bce5a2 259$end (0) 0
3c31a486 260error (256)
007a50a4
AD
261NUM (258) 2
262OP (259) 1
3c31a486
AD
263
264
265Nonterminals, with rules where they appear
266
88bce5a2 267$accept (5)
3c31a486
AD
268 on left: 0
269exp (6)
270 on left: 1 2, on right: 0 1
271
272
273state 0
274
88bce5a2 275 0 $accept: . exp $end
ce4ccb4b
AD
276 1 exp: . exp OP exp
277 2 | . NUM
643a5994 278
87675353 279 NUM shift, and go to state 1
3c31a486 280
87675353 281 exp go to state 2
3c31a486
AD
282
283
284state 1
285
ce4ccb4b 286 2 exp: NUM .
3c31a486 287
87675353 288 $default reduce using rule 2 (exp)
3c31a486
AD
289
290
291state 2
292
88bce5a2 293 0 $accept: exp . $end
ce4ccb4b 294 1 exp: exp . OP exp
3c31a486 295
88bce5a2
AD
296 $end shift, and go to state 3
297 OP shift, and go to state 4
3c31a486
AD
298
299
300state 3
301
88bce5a2 302 0 $accept: exp $end .
3c31a486 303
e8832397 304 $default accept
3c31a486
AD
305
306
307state 4
308
ce4ccb4b
AD
309 1 exp: . exp OP exp
310 1 | exp OP . exp
311 2 | . NUM
3c31a486 312
87675353 313 NUM shift, and go to state 1
3c31a486 314
87675353 315 exp go to state 5
3c31a486
AD
316
317
318state 5
319
88bce5a2
AD
320 1 exp: exp . OP exp [$end, OP]
321 1 | exp OP exp . [$end, OP]
3c31a486 322
87675353 323 $default reduce using rule 1 (exp)
7ea9a33f 324
4b3d3a8e 325 Conflict between rule 1 and token OP resolved as reduce (%left OP).
bc933ef1
AD
326]])
327
328AT_CLEANUP
329
330
bc933ef1
AD
331## -------------------------------- ##
332## Defaulted Conflicted Reduction. ##
333## -------------------------------- ##
334
335# When there are RR conflicts, some rules are disabled. Usually it is
336# simply displayed as:
337#
88bce5a2
AD
338# $end reduce using rule 3 (num)
339# $end [reduce using rule 4 (id)]
bc933ef1
AD
340#
341# But when `reduce 3' is the default action, we'd produce:
342#
88bce5a2 343# $end [reduce using rule 4 (id)]
bc933ef1
AD
344# $default reduce using rule 3 (num)
345#
346# In this precise case (a reduction is masked by the default
347# reduction), we make the `reduce 3' explicit:
348#
88bce5a2
AD
349# $end reduce using rule 3 (num)
350# $end [reduce using rule 4 (id)]
bc933ef1
AD
351# $default reduce using rule 3 (num)
352#
353# Maybe that's not the best display, but then, please propose something
354# else.
355
356AT_SETUP([Defaulted Conflicted Reduction])
357AT_KEYWORDS([report])
358
359AT_DATA([input.y],
360[[%%
361exp: num | id;
362num: '0';
363id : '0';
364%%
365]])
366
b56471a6 367AT_CHECK([bison -o input.c --report=all input.y], 0, [],
2c8ba4cd 368[[input.y: conflicts: 1 reduce/reduce
2bf21a83 369input.y:4.6-8: warning: rule never reduced because of conflicts: id: '0'
e8832397 370]])
bc933ef1
AD
371
372# Check the contents of the report.
373AT_CHECK([cat input.output], [],
c8f002c7
AD
374[[Rules never reduced
375
376 4 id: '0'
377
378
2c8ba4cd 379State 1 conflicts: 1 reduce/reduce
bc933ef1
AD
380
381
382Grammar
383
88bce5a2 384 0 $accept: exp $end
bc933ef1
AD
385
386 1 exp: num
387 2 | id
388
389 3 num: '0'
390
391 4 id: '0'
392
393
394Terminals, with rules where they appear
395
88bce5a2 396$end (0) 0
bc933ef1
AD
397'0' (48) 3 4
398error (256)
399
400
401Nonterminals, with rules where they appear
402
88bce5a2 403$accept (4)
bc933ef1
AD
404 on left: 0
405exp (5)
406 on left: 1 2, on right: 0
407num (6)
408 on left: 3, on right: 1
409id (7)
410 on left: 4, on right: 2
411
412
413state 0
414
88bce5a2 415 0 $accept: . exp $end
ce4ccb4b
AD
416 1 exp: . num
417 2 | . id
418 3 num: . '0'
419 4 id: . '0'
bc933ef1 420
87675353 421 '0' shift, and go to state 1
bc933ef1 422
87675353
AD
423 exp go to state 2
424 num go to state 3
425 id go to state 4
bc933ef1
AD
426
427
428state 1
429
88bce5a2
AD
430 3 num: '0' . [$end]
431 4 id: '0' . [$end]
bc933ef1 432
88bce5a2
AD
433 $end reduce using rule 3 (num)
434 $end [reduce using rule 4 (id)]
87675353 435 $default reduce using rule 3 (num)
bc933ef1
AD
436
437
438state 2
439
88bce5a2 440 0 $accept: exp . $end
bc933ef1 441
88bce5a2 442 $end shift, and go to state 5
bc933ef1
AD
443
444
445state 3
446
ce4ccb4b 447 1 exp: num .
bc933ef1 448
87675353 449 $default reduce using rule 1 (exp)
bc933ef1
AD
450
451
452state 4
453
ce4ccb4b 454 2 exp: id .
bc933ef1 455
87675353 456 $default reduce using rule 2 (exp)
bc933ef1
AD
457
458
459state 5
460
88bce5a2 461 0 $accept: exp $end .
bc933ef1 462
e8832397 463 $default accept
3c31a486
AD
464]])
465
466AT_CLEANUP
467
468
469
470
471## -------------------- ##
472## %expect not enough. ##
473## -------------------- ##
474
475AT_SETUP([%expect not enough])
476
477AT_DATA([input.y],
478[[%token NUM OP
479%expect 0
480%%
481exp: exp OP exp | NUM;
482]])
483
035aa4a0 484AT_CHECK([bison -o input.c input.y], 1, [],
2c8ba4cd 485[input.y: conflicts: 1 shift/reduce
035aa4a0 486input.y: expected 0 shift/reduce conflicts
3c31a486
AD
487])
488AT_CLEANUP
489
490
491## --------------- ##
492## %expect right. ##
493## --------------- ##
494
495AT_SETUP([%expect right])
496
497AT_DATA([input.y],
498[[%token NUM OP
499%expect 1
500%%
501exp: exp OP exp | NUM;
502]])
503
b56471a6 504AT_CHECK([bison -o input.c input.y])
3c31a486
AD
505AT_CLEANUP
506
507
508## ------------------ ##
509## %expect too much. ##
510## ------------------ ##
511
512AT_SETUP([%expect too much])
513
514AT_DATA([input.y],
515[[%token NUM OP
516%expect 2
517%%
518exp: exp OP exp | NUM;
519]])
520
035aa4a0 521AT_CHECK([bison -o input.c input.y], 1, [],
2c8ba4cd 522[input.y: conflicts: 1 shift/reduce
035aa4a0 523input.y: expected 2 shift/reduce conflicts
3c31a486
AD
524])
525AT_CLEANUP
6876ecd3
PE
526
527
528## ------------------------------ ##
529## %expect with reduce conflicts ##
530## ------------------------------ ##
531
532AT_SETUP([%expect with reduce conflicts])
533
534AT_DATA([input.y],
535[[%expect 0
536%%
537program: a 'a' | a a;
538a: 'a';
539]])
540
035aa4a0 541AT_CHECK([bison -o input.c input.y], 1, [],
2c8ba4cd 542[input.y: conflicts: 1 reduce/reduce
035aa4a0 543input.y: expected 0 reduce/reduce conflicts
6876ecd3
PE
544])
545AT_CLEANUP
39a06c25
PE
546
547
22fccf95
PE
548## ------------------------------- ##
549## %no-default-prec without %prec ##
550## ------------------------------- ##
39a06c25 551
22fccf95 552AT_SETUP([%no-default-prec without %prec])
39a06c25
PE
553
554AT_DATA([[input.y]],
555[[%left '+'
556%left '*'
557
558%%
559
22fccf95 560%no-default-prec;
39a06c25
PE
561
562e: e '+' e
563 | e '*' e
564 | '0'
565 ;
566]])
567
568AT_CHECK([bison -o input.c input.y], 0, [],
569[[input.y: conflicts: 4 shift/reduce
570]])
571AT_CLEANUP
572
573
22fccf95
PE
574## ---------------------------- ##
575## %no-default-prec with %prec ##
576## ---------------------------- ##
39a06c25 577
22fccf95 578AT_SETUP([%no-default-prec with %prec])
39a06c25
PE
579
580AT_DATA([[input.y]],
581[[%left '+'
582%left '*'
583
584%%
585
22fccf95 586%no-default-prec;
39a06c25
PE
587
588e: e '+' e %prec '+'
589 | e '*' e %prec '*'
590 | '0'
591 ;
592]])
593
594AT_CHECK([bison -o input.c input.y])
595AT_CLEANUP
596
597
598## ---------------- ##
22fccf95 599## %default-prec ##
39a06c25
PE
600## ---------------- ##
601
22fccf95 602AT_SETUP([%default-prec])
39a06c25
PE
603
604AT_DATA([[input.y]],
605[[%left '+'
606%left '*'
607
608%%
609
22fccf95 610%default-prec;
39a06c25
PE
611
612e: e '+' e
613 | e '*' e
614 | '0'
615 ;
616]])
617
618AT_CHECK([bison -o input.c input.y])
619AT_CLEANUP