X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/007a50a493714fdda37f9600e068cf705c8ec3f1..fcbfa6b01c0222b01254730c66d539ed2c841a4e:/tests/conflicts.at?ds=sidebyside diff --git a/tests/conflicts.at b/tests/conflicts.at index 713b49e0..58838e7e 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -37,29 +37,35 @@ exp: e 'e'; e: 'e' | /* Nothing. */; ]]) -AT_CHECK([bison input.y -o input.c]) +AT_CHECK([bison -o input.c input.y], 0, [], +[[input.y:4.9: warning: rule never reduced because of conflicts: e: /* empty */ +]]) AT_CLEANUP + ## ------------------- ## ## %nonassoc and eof. ## ## ------------------- ## AT_SETUP([%nonassoc and eof]) -AT_DATA([input.y], +AT_DATA_GRAMMAR([input.y], [[ %{ #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; @@ -94,24 +100,24 @@ 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_CHECK([bison -o input.c input.y]) +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], [], - [parse error, unexpected '<', expecting '<' or '>' +AT_PARSER_CHECK([./input '0<0<0'], [1], [], + [syntax error, unexpected '<', expecting '<' or '>' ]) -AT_CHECK([./input '0>0']) -AT_CHECK([./input '0>0>0'], [1], [], - [parse error, unexpected '>', expecting '<' or '>' +AT_PARSER_CHECK([./input '0>0']) +AT_PARSER_CHECK([./input '0>0>0'], [1], [], + [syntax error, unexpected '>', expecting '<' or '>' ]) -AT_CHECK([./input '0<0>0'], [1], [], - [parse error, unexpected '>', expecting '<' or '>' +AT_PARSER_CHECK([./input '0<0>0'], [1], [], + [syntax error, unexpected '>', expecting '<' or '>' ]) AT_CLEANUP @@ -124,14 +130,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 -o input.c --report=all input.y], 0, [], +[input.y: warning: 1 shift/reduce conflict ]) # Check the contents of the report. @@ -141,15 +149,15 @@ 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 (258) 2 OP (259) 1 @@ -157,7 +165,7 @@ 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 @@ -165,97 +173,94 @@ exp (6) state 0 - $axiom -> . exp $ (rule 0) + 0 $accept: . exp $end + 1 exp: . exp OP exp + 2 | . NUM - NUM shift, and go to state 1 - - 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 -o input.c --report=all input.y]) # 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 (258) 2 OP (259) 1 @@ -263,7 +268,7 @@ 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 @@ -271,60 +276,195 @@ exp (6) state 0 - $axiom -> . exp $ (rule 0) + 0 $accept: . exp $end + 1 exp: . exp OP exp + 2 | . NUM - NUM shift, and go to state 1 - - 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) + 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 -o input.c --report=all input.y], 0, [], +[[input.y: warning: 1 reduce/reduce conflict +input.y:4.6-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' + + +State 1 contains 1 reduce/reduce conflict. - OP shift, and go to state 4 - $default reduce using rule 1 (exp) +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 @@ -345,9 +485,9 @@ AT_DATA([input.y], 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 +AT_CHECK([bison -o input.c input.y], 1, [], +[input.y: warning: 1 shift/reduce conflict +input.y: expected 0 shift/reduce conflicts ]) AT_CLEANUP @@ -365,7 +505,7 @@ AT_DATA([input.y], exp: exp OP exp | NUM; ]]) -AT_CHECK([bison input.y -o input.c], 0) +AT_CHECK([bison -o input.c input.y]) AT_CLEANUP @@ -382,8 +522,8 @@ AT_DATA([input.y], 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 +AT_CHECK([bison -o input.c input.y], 1, [], +[input.y: warning: 1 shift/reduce conflict +input.y: expected 2 shift/reduce conflicts ]) AT_CLEANUP