1 # Exercising Bison on conflicts. -*- Autotest -*-
2 # Copyright (C) 2002 Free Software Foundation, Inc.
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)
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.
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
19 AT_BANNER([[Conflicts.]])
22 ## ---------------- ##
24 ## ---------------- ##
26 # I once hacked Bison in such a way that it lost its reductions on the
27 # initial state (because it was confusing it with the last state). It
28 # took me a while to strip down my failures to this simple case. So
29 # make sure it finds the s/r conflict below.
31 AT_SETUP([S/R in initial])
37 e: 'e' | /* Nothing. */;
40 AT_CHECK([bison input.y -o input.c])
44 ## ------------------- ##
45 ## %nonassoc and eof. ##
46 ## ------------------- ##
48 AT_SETUP([%nonassoc and eof])
54 /* We don't need a perfect malloc for these tests. */
62 #define YYERROR_VERBOSE 1
64 yyerror (const char *msg)
66 fprintf (stderr, "%s\n", msg);
70 /* The current argument. */
71 static const char *input = NULL;
76 /* No token stands for end of file. */
94 main (int argc, const char *argv[])
102 # Specify the output files to avoid problems on different file systems.
103 AT_CHECK([bison input.y -o input.c])
104 AT_CHECK([$CC $CFLAGS $CPPFLAGS input.c -o input], 0, [], [ignore])
106 AT_CHECK([./input '0<0'])
107 # FIXME: This is an actual bug, but a new one, in the sense that
108 # no one has ever spotted it! The messages are *wrong*: there should
109 # be nothing there, it should be expected eof.
110 AT_CHECK([./input '0<0<0'], [1], [],
111 [parse error, unexpected '<', expecting '<' or '>'
114 AT_CHECK([./input '0>0'])
115 AT_CHECK([./input '0>0>0'], [1], [],
116 [parse error, unexpected '>', expecting '<' or '>'
119 AT_CHECK([./input '0<0>0'], [1], [],
120 [parse error, unexpected '>', expecting '<' or '>'
127 ## ------------------------- ##
128 ## Unresolved SR Conflicts. ##
129 ## ------------------------- ##
131 AT_SETUP([Unresolved SR Conflicts])
133 AT_KEYWORDS([report])
138 exp: exp OP exp | NUM;
141 AT_CHECK([bison input.y -o input.c --report=all], 0, [],
142 [input.y contains 1 shift/reduce conflict.
145 # Check the contents of the report.
146 AT_CHECK([cat input.output], [],
147 [[State 5 contains 1 shift/reduce conflict.
158 Terminals, with rules where they appear
166 Nonterminals, with rules where they appear
171 on left: 1 2, on right: 0 1
176 $axiom -> . exp $ (rule 0)
177 exp -> . exp OP exp (rule 1)
178 exp -> . NUM (rule 2)
180 NUM shift, and go to state 1
188 exp -> NUM . (rule 2)
190 $default reduce using rule 2 (exp)
196 $axiom -> exp . $ (rule 0)
197 exp -> exp . OP exp (rule 1)
199 $ shift, and go to state 3
200 OP shift, and go to state 4
206 $axiom -> exp $ . (rule 0)
213 exp -> . exp OP exp (rule 1)
214 exp -> exp OP . exp (rule 1)
215 exp -> . NUM (rule 2)
217 NUM shift, and go to state 1
225 exp -> exp . OP exp [$, OP] (rule 1)
226 exp -> exp OP exp . [$, OP] (rule 1)
228 OP shift, and go to state 4
230 OP [reduce using rule 1 (exp)]
231 $default reduce using rule 1 (exp)
240 ## --------------------- ##
241 ## Solved SR Conflicts. ##
242 ## --------------------- ##
244 AT_SETUP([Solved SR Conflicts])
246 AT_KEYWORDS([report])
252 exp: exp OP exp | NUM;
255 AT_CHECK([bison input.y -o input.c --report=all], 0, [], [])
257 # Check the contents of the report.
258 AT_CHECK([cat input.output], [],
267 Terminals, with rules where they appear
275 Nonterminals, with rules where they appear
280 on left: 1 2, on right: 0 1
285 $axiom -> . exp $ (rule 0)
286 exp -> . exp OP exp (rule 1)
287 exp -> . NUM (rule 2)
289 NUM shift, and go to state 1
297 exp -> NUM . (rule 2)
299 $default reduce using rule 2 (exp)
305 $axiom -> exp . $ (rule 0)
306 exp -> exp . OP exp (rule 1)
308 $ shift, and go to state 3
309 OP shift, and go to state 4
315 $axiom -> exp $ . (rule 0)
322 exp -> . exp OP exp (rule 1)
323 exp -> exp OP . exp (rule 1)
324 exp -> . NUM (rule 2)
326 NUM shift, and go to state 1
334 exp -> exp . OP exp [$] (rule 1)
335 exp -> exp OP exp . [$] (rule 1)
337 OP shift, and go to state 4
339 $default reduce using rule 1 (exp)
341 Conflict between rule 2 and token OP resolved as reduce (%right OP).
351 ## -------------------- ##
352 ## %expect not enough. ##
353 ## -------------------- ##
355 AT_SETUP([%expect not enough])
361 exp: exp OP exp | NUM;
364 AT_CHECK([bison input.y -o input.c], 1, [],
365 [input.y contains 1 shift/reduce conflict.
366 expected 0 shift/reduce conflicts
371 ## --------------- ##
373 ## --------------- ##
375 AT_SETUP([%expect right])
381 exp: exp OP exp | NUM;
384 AT_CHECK([bison input.y -o input.c], 0)
388 ## ------------------ ##
389 ## %expect too much. ##
390 ## ------------------ ##
392 AT_SETUP([%expect too much])
398 exp: exp OP exp | NUM;
401 AT_CHECK([bison input.y -o input.c], 1, [],
402 [input.y contains 1 shift/reduce conflict.
403 expected 2 shift/reduce conflicts