X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/3c31a486e76ca670cc2fbb9d452410cbf99258cd..c8f002c7d3407d5c91a5882466916160a72aa8c4:/tests/conflicts.at?ds=sidebyside diff --git a/tests/conflicts.at b/tests/conflicts.at index 2c017876..6f0a971f 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -1,5 +1,5 @@ # Exercising Bison on conflicts. -*- Autotest -*- -# Copyright 2002 Free Software Foundation, Inc. +# Copyright (C) 2002 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -19,6 +19,31 @@ AT_BANNER([[Conflicts.]]) +## ---------------- ## +## S/R in initial. ## +## ---------------- ## + +# I once hacked Bison in such a way that it lost its reductions on the +# initial state (because it was confusing it with the last state). It +# took me a while to strip down my failures to this simple case. So +# make sure it finds the s/r conflict below. + +AT_SETUP([S/R in initial]) + +AT_DATA([[input.y]], +[[%expect 1 +%% +exp: e 'e'; +e: 'e' | /* Nothing. */; +]]) + +AT_CHECK([bison input.y -o input.c], 0, [], +[[input.y:4.8: warning: rule never reduced because of conflicts: e: /* empty */ +]]) + +AT_CLEANUP + + ## ------------------- ## ## %nonassoc and eof. ## ## ------------------- ## @@ -28,16 +53,22 @@ AT_SETUP([%nonassoc and eof]) AT_DATA([input.y], [[ %{ +#include +/* We don't need a perfect malloc for these tests. */ +#undef malloc #include -#include -#include -#include + +#if STDC_HEADERS +# include +#endif + #define YYERROR_VERBOSE 1 -#define yyerror(Msg) \ -do { \ - fprintf (stderr, "%s\n", Msg); \ - exit (1); \ -} while (0) +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); + exit (1); +} /* The current argument. */ static const char *input = NULL; @@ -73,22 +104,22 @@ main (int argc, const char *argv[]) # Specify the output files to avoid problems on different file systems. AT_CHECK([bison input.y -o input.c]) -AT_CHECK([$CC $CFLAGS $CPPFLAGS input.c -o input], 0, [], [ignore]) +AT_COMPILE([input]) -AT_CHECK([./input '0<0']) +AT_PARSER_CHECK([./input '0<0']) # FIXME: This is an actual bug, but a new one, in the sense that # no one has ever spotted it! The messages are *wrong*: there should # be nothing there, it should be expected eof. -AT_CHECK([./input '0<0<0'], [1], [], +AT_PARSER_CHECK([./input '0<0<0'], [1], [], [parse error, unexpected '<', expecting '<' or '>' ]) -AT_CHECK([./input '0>0']) -AT_CHECK([./input '0>0>0'], [1], [], +AT_PARSER_CHECK([./input '0>0']) +AT_PARSER_CHECK([./input '0>0>0'], [1], [], [parse error, unexpected '>', expecting '<' or '>' ]) -AT_CHECK([./input '0<0>0'], [1], [], +AT_PARSER_CHECK([./input '0<0>0'], [1], [], [parse error, unexpected '>', expecting '<' or '>' ]) @@ -102,14 +133,16 @@ AT_CLEANUP AT_SETUP([Unresolved SR Conflicts]) +AT_KEYWORDS([report]) + AT_DATA([input.y], [[%token NUM OP %% exp: exp OP exp | NUM; ]]) -AT_CHECK([bison input.y -o input.c -v], 0, [], -[input.y contains 1 shift/reduce conflict. +AT_CHECK([bison input.y -o input.c --report=all], 0, [], +[input.y: warning: 1 shift/reduce conflict ]) # Check the contents of the report. @@ -119,23 +152,23 @@ AT_CHECK([cat input.output], [], Grammar - Number, Line, Rule - 0 3 $axiom -> exp $ - 1 3 exp -> exp OP exp - 2 3 exp -> NUM + 0 $accept: exp $end + + 1 exp: exp OP exp + 2 | NUM Terminals, with rules where they appear -$ (0) 0 +$end (0) 0 error (256) -NUM (257) 2 -OP (258) 1 +NUM (258) 2 +OP (259) 1 Nonterminals, with rules where they appear -$axiom (5) +$accept (5) on left: 0 exp (6) on left: 1 2, on right: 0 1 @@ -143,103 +176,102 @@ exp (6) state 0 - NUM shift, and go to state 1 + 0 $accept: . exp $end + 1 exp: . exp OP exp + 2 | . NUM - exp go to state 2 + NUM shift, and go to state 1 + exp go to state 2 state 1 - exp -> NUM . (rule 2) - - $default reduce using rule 2 (exp) + 2 exp: NUM . + $default reduce using rule 2 (exp) state 2 - $axiom -> exp . $ (rule 0) - exp -> exp . OP exp (rule 1) - - $ shift, and go to state 3 - OP shift, and go to state 4 + 0 $accept: exp . $end + 1 exp: exp . OP exp + $end shift, and go to state 3 + OP shift, and go to state 4 state 3 - $axiom -> exp $ . (rule 0) + 0 $accept: exp $end . - $default accept + $default accept state 4 - exp -> exp OP . exp (rule 1) - - NUM shift, and go to state 1 + 1 exp: . exp OP exp + 1 | exp OP . exp + 2 | . NUM - exp go to state 5 + NUM shift, and go to state 1 + exp go to state 5 state 5 - exp -> exp . OP exp (rule 1) - exp -> exp OP exp . (rule 1) - - OP shift, and go to state 4 - - OP [reduce using rule 1 (exp)] - $default reduce using rule 1 (exp) - + 1 exp: exp . OP exp [$end, OP] + 1 | exp OP exp . [$end, OP] + OP shift, and go to state 4 + OP [reduce using rule 1 (exp)] + $default reduce using rule 1 (exp) ]]) AT_CLEANUP -## --------------------- ## -## Solved SR Conflicts. ## -## --------------------- ## -AT_SETUP([Solved SR Conflicts]) +## ----------------------- ## +## Resolved SR Conflicts. ## +## ----------------------- ## + +AT_SETUP([Resolved SR Conflicts]) + +AT_KEYWORDS([report]) AT_DATA([input.y], [[%token NUM OP -%right OP +%left OP %% exp: exp OP exp | NUM; ]]) -AT_CHECK([bison input.y -o input.c -v], 0, [], []) +AT_CHECK([bison input.y -o input.c --report=all]) # Check the contents of the report. AT_CHECK([cat input.output], [], -[[Conflict in state 5 between rule 2 and token OP resolved as shift. - +[[Grammar -Grammar + 0 $accept: exp $end - Number, Line, Rule - 0 4 $axiom -> exp $ - 1 4 exp -> exp OP exp - 2 4 exp -> NUM + 1 exp: exp OP exp + 2 | NUM Terminals, with rules where they appear -$ (0) 0 +$end (0) 0 error (256) -NUM (257) 2 -OP (258) 1 +NUM (258) 2 +OP (259) 1 Nonterminals, with rules where they appear -$axiom (5) +$accept (5) on left: 0 exp (6) on left: 1 2, on right: 0 1 @@ -247,58 +279,194 @@ exp (6) state 0 - NUM shift, and go to state 1 + 0 $accept: . exp $end + 1 exp: . exp OP exp + 2 | . NUM - exp go to state 2 + NUM shift, and go to state 1 + exp go to state 2 state 1 - exp -> NUM . (rule 2) - - $default reduce using rule 2 (exp) + 2 exp: NUM . + $default reduce using rule 2 (exp) state 2 - $axiom -> exp . $ (rule 0) - exp -> exp . OP exp (rule 1) - - $ shift, and go to state 3 - OP shift, and go to state 4 + 0 $accept: exp . $end + 1 exp: exp . OP exp + $end shift, and go to state 3 + OP shift, and go to state 4 state 3 - $axiom -> exp $ . (rule 0) + 0 $accept: exp $end . - $default accept + $default accept state 4 - exp -> exp OP . exp (rule 1) + 1 exp: . exp OP exp + 1 | exp OP . exp + 2 | . NUM - NUM shift, and go to state 1 - - exp go to state 5 + NUM shift, and go to state 1 + exp go to state 5 state 5 - exp -> exp . OP exp (rule 1) - exp -> exp OP exp . (rule 1) + 1 exp: exp . OP exp [$end, OP] + 1 | exp OP exp . [$end, OP] + + $default reduce using rule 1 (exp) + Conflict between rule 1 and token OP resolved as reduce (%left OP). +]]) + +AT_CLEANUP + + +## -------------------------------- ## +## Defaulted Conflicted Reduction. ## +## -------------------------------- ## + +# When there are RR conflicts, some rules are disabled. Usually it is +# simply displayed as: +# +# $end reduce using rule 3 (num) +# $end [reduce using rule 4 (id)] +# +# But when `reduce 3' is the default action, we'd produce: +# +# $end [reduce using rule 4 (id)] +# $default reduce using rule 3 (num) +# +# In this precise case (a reduction is masked by the default +# reduction), we make the `reduce 3' explicit: +# +# $end reduce using rule 3 (num) +# $end [reduce using rule 4 (id)] +# $default reduce using rule 3 (num) +# +# Maybe that's not the best display, but then, please propose something +# else. + +AT_SETUP([Defaulted Conflicted Reduction]) +AT_KEYWORDS([report]) + +AT_DATA([input.y], +[[%% +exp: num | id; +num: '0'; +id : '0'; +%% +]]) + +AT_CHECK([bison input.y -o input.c --report=all], 0, [], +[[input.y: warning: 1 reduce/reduce conflict +input.y:4.4-8: warning: rule never reduced because of conflicts: id: '0' +]]) + +# Check the contents of the report. +AT_CHECK([cat input.output], [], +[[Rules never reduced + + 4 id: '0' - OP shift, and go to state 4 - $default reduce using rule 1 (exp) +State 1 contains 1 reduce/reduce conflict. +Grammar + + 0 $accept: exp $end + + 1 exp: num + 2 | id + + 3 num: '0' + + 4 id: '0' + + +Terminals, with rules where they appear + +$end (0) 0 +'0' (48) 3 4 +error (256) + + +Nonterminals, with rules where they appear + +$accept (4) + on left: 0 +exp (5) + on left: 1 2, on right: 0 +num (6) + on left: 3, on right: 1 +id (7) + on left: 4, on right: 2 + + +state 0 + + 0 $accept: . exp $end + 1 exp: . num + 2 | . id + 3 num: . '0' + 4 id: . '0' + + '0' shift, and go to state 1 + + exp go to state 2 + num go to state 3 + id go to state 4 + + +state 1 + + 3 num: '0' . [$end] + 4 id: '0' . [$end] + + $end reduce using rule 3 (num) + $end [reduce using rule 4 (id)] + $default reduce using rule 3 (num) + + +state 2 + + 0 $accept: exp . $end + + $end shift, and go to state 5 + + +state 3 + + 1 exp: num . + $default reduce using rule 1 (exp) + + +state 4 + + 2 exp: id . + + $default reduce using rule 2 (exp) + + +state 5 + + 0 $accept: exp $end . + + $default accept ]]) AT_CLEANUP @@ -320,8 +488,8 @@ exp: exp OP exp | NUM; ]]) AT_CHECK([bison input.y -o input.c], 1, [], -[input.y contains 1 shift/reduce conflict. -expected 0 shift/reduce conflicts +[input.y: warning: 1 shift/reduce conflict +input.y: expected 0 shift/reduce conflicts ]) AT_CLEANUP @@ -339,7 +507,7 @@ AT_DATA([input.y], exp: exp OP exp | NUM; ]]) -AT_CHECK([bison input.y -o input.c], 0) +AT_CHECK([bison input.y -o input.c]) AT_CLEANUP @@ -357,7 +525,7 @@ exp: exp OP exp | NUM; ]]) AT_CHECK([bison input.y -o input.c], 1, [], -[input.y contains 1 shift/reduce conflict. -expected 2 shift/reduce conflicts +[input.y: warning: 1 shift/reduce conflict +input.y: expected 2 shift/reduce conflicts ]) AT_CLEANUP