X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/d87ea54cf6cc98d52356c138bd142d1b450bbc9a..ff2e3d397a415636bd87a29193aec995f586f433:/tests/conflicts.at diff --git a/tests/conflicts.at b/tests/conflicts.at index 83ef1286..2d67a358 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -1,6 +1,6 @@ # Exercising Bison on conflicts. -*- Autotest -*- -# Copyright (C) 2002-2005, 2007-2012 Free Software Foundation, Inc. +# Copyright (C) 2002-2005, 2007-2013 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 @@ -17,6 +17,247 @@ AT_BANNER([[Conflicts.]]) +## ------------------------- ## +## Token declaration order. ## +## ------------------------- ## + +# This test checks that token are declared left to right when in a precedence +# statement. + +AT_SETUP([Token declaration order]) + +AT_BISON_OPTION_PUSHDEFS + +AT_DATA_GRAMMAR([[input.y]], +[[%code { + #include + ]AT_YYERROR_DECLARE[ + ]AT_YYLEX_DECLARE[ +} +%token A B C +%token D +%right E F G +%right H I +%right J +%left K +%left L M N +%nonassoc O P Q +%precedence R S T U +%precedence V W +%% +exp: A +%% +]AT_YYERROR_DEFINE[ +]AT_YYLEX_DEFINE[ +int main (void) +{ + assert (A < B); + assert (B < C); + assert (C < D); + assert (D < E); + assert (E < F); + assert (F < G); + assert (G < H); + assert (H < I); + assert (I < J); + assert (J < K); + assert (K < L); + assert (L < M); + assert (M < N); + assert (N < O); + assert (O < P); + assert (P < Q); + assert (Q < R); + assert (R < S); + assert (S < T); + assert (T < U); + assert (U < V); + assert (V < W); + return 0; +} +]]) + +AT_BISON_CHECK([-o input.c input.y]) +AT_COMPILE([input]) + +AT_PARSER_CHECK([./input]) + +AT_BISON_OPTION_POPDEFS + +AT_CLEANUP + + +## --------------------------------------------------- ## +## Token declaration order: literals vs. identifiers. ## +## --------------------------------------------------- ## + +# This test checks that when several tokens are declared by the same keyword, +# some of them defined as a character ('a'), others as simple textual reference +# (A), they are declared correctly left to right. +# Previously, the following test would declare the states in the order 'o' 'p' +# M N, instead of M N 'o' 'p'. + +AT_SETUP([Token declaration order: literals vs. identifiers]) + +AT_DATA_GRAMMAR([[input.y]], +[[%token 'a' 'b' C D +%token E F 'g' 'h' +%right 'i' 'j' K L +%right M N 'o' 'p' +%% +exp: 'a' + | 'b' + | C + | D + | E + | F + | 'g' + | 'h' + | 'i' + | 'j' + | K + | L + | M + | N + | 'o' + | 'p' +; +%% +]]) + +AT_BISON_CHECK([[--report=all -o input.c input.y]], 0, [], [ignore]) +AT_CHECK([[cat input.output | sed -n '/^State 0$/,/^State 1$/p']], 0, +[[State 0 + + 0 $accept: . exp $end + 1 exp: . 'a' + 2 | . 'b' + 3 | . C + 4 | . D + 5 | . E + 6 | . F + 7 | . 'g' + 8 | . 'h' + 9 | . 'i' + 10 | . 'j' + 11 | . K + 12 | . L + 13 | . M + 14 | . N + 15 | . 'o' + 16 | . 'p' + + 'a' shift, and go to state 1 + 'b' shift, and go to state 2 + C shift, and go to state 3 + D shift, and go to state 4 + E shift, and go to state 5 + F shift, and go to state 6 + 'g' shift, and go to state 7 + 'h' shift, and go to state 8 + 'i' shift, and go to state 9 + 'j' shift, and go to state 10 + K shift, and go to state 11 + L shift, and go to state 12 + M shift, and go to state 13 + N shift, and go to state 14 + 'o' shift, and go to state 15 + 'p' shift, and go to state 16 + + exp go to state 17 + + +State 1 +]]) + +AT_CLEANUP + + +## ------------------------------- ## +## Useless associativity warning. ## +## ------------------------------- ## + +AT_SETUP([Useless associativity warning]) + +AT_DATA([[input.y]], +[[%nonassoc "=" +%left "+" +%left "*" +%precedence "(" +%% +stmt: + exp +| "var" "=" exp +; + +exp: + exp "+" exp +| exp "*" "num" +| "(" exp ")" +| "num" +; +]]) + +AT_BISON_CHECK([-Wprecedence input.y], 0, [], +[[input.y:1.11-13: warning: useless precedence and associativity for "=" [-Wprecedence] +input.y:3.7-9: warning: useless associativity for "*", use %precedence [-Wprecedence] +input.y:4.13-15: warning: useless precedence for "(" [-Wprecedence] +]]) + +AT_CLEANUP + + +## ---------------------------- ## +## Useless precedence warning. ## +## ---------------------------- ## + +AT_SETUP([Useless precedence warning]) + +AT_DATA([[input.y]], +[[%token A B +%precedence Z +%left X +%precedence Y +%left W +%right V +%nonassoc U +%% +a: b + | a U b + | f +; +b: c + | b V c +; +c: d + | c W d +; +d: A + | d X d + | d Y A +; +f: B + | f Z B +; +]]) + +AT_BISON_CHECK([-Wprecedence -fcaret -o input.c input.y], 0, [], +[[input.y:2.13: warning: useless precedence for Z [-Wprecedence] + %precedence Z + ^ +input.y:5.7: warning: useless precedence and associativity for W [-Wprecedence] + %left W + ^ +input.y:6.8: warning: useless precedence and associativity for V [-Wprecedence] + %right V + ^ +input.y:7.11: warning: useless precedence and associativity for U [-Wprecedence] + %nonassoc U + ^ +]]) + +AT_CLEANUP + ## ---------------- ## ## S/R in initial. ## @@ -37,7 +278,13 @@ e: 'e' | /* Nothing. */; ]]) AT_BISON_CHECK([-o input.c input.y], 0, [], -[[input.y:4.9: warning: rule useless in parser due to conflicts: e: /* empty */ [-Wother] +[[input.y:4.9: warning: rule useless in parser due to conflicts [-Wother] +]]) + +AT_BISON_CHECK([-fcaret -o input.c input.y], 0, [], +[[input.y:4.9: warning: rule useless in parser due to conflicts [-Wother] + e: 'e' | /* Nothing. */; + ^ ]]) AT_CLEANUP @@ -117,10 +364,10 @@ AT_NONASSOC_AND_EOF_CHECK([], [[incorrect]]) # We must disable default reductions in inconsistent states in order to # have an explicit list of all expected tokens. -AT_NONASSOC_AND_EOF_CHECK([[-Dlr.default-reductions=consistent]], +AT_NONASSOC_AND_EOF_CHECK([[-Dlr.default-reduction=consistent]], [[correct]]) -# lr.default-reductions=consistent happens to work for this test case. +# lr.default-reduction=consistent happens to work for this test case. # However, for other grammars, lookahead sets can be merged for # different left contexts, so it is still possible to have an incorrect # expected list. Canonical LR is almost a general solution (that is, it @@ -215,30 +462,9 @@ public Object getLVal () /*-------. | main. | -`-------*/]AT_SKEL_JAVA_IF([[ - -class input -{ - public static void main (String args[]) throws IOException - { - YYParser p = new YYParser (); - p.parse (); - } -}]], [AT_SKEL_CC_IF([[ - -int -main (void) -{ - yy::parser parser; - return parser.parse (); -}]], [[ - -int -main (void) -{ - return yyparse (); -}]])])[ -]]) +`-------*/ +]AT_MAIN_DEFINE +]) AT_FULL_COMPILE([[input]]) @@ -310,12 +536,12 @@ AT_CONSISTENT_ERRORS_CHECK([[%define lr.type ielr # Even canonical LR doesn't foresee the error for 'a'! AT_CONSISTENT_ERRORS_CHECK([[%define lr.type ielr - %define lr.default-reductions consistent]], + %define lr.default-reduction consistent]], [AT_PREVIOUS_STATE_GRAMMAR], [AT_PREVIOUS_STATE_INPUT], [[$end]], [[ab]]) AT_CONSISTENT_ERRORS_CHECK([[%define lr.type ielr - %define lr.default-reductions accepting]], + %define lr.default-reduction accepting]], [AT_PREVIOUS_STATE_GRAMMAR], [AT_PREVIOUS_STATE_INPUT], [[$end]], [[ab]]) @@ -396,13 +622,13 @@ AT_CONSISTENT_ERRORS_CHECK([[%glr-parser]], [['b']], [[none]]) # No C++ or Java test because yychar cannot be manipulated by users. -AT_CONSISTENT_ERRORS_CHECK([[%define lr.default-reductions consistent]], +AT_CONSISTENT_ERRORS_CHECK([[%define lr.default-reduction consistent]], [AT_USER_ACTION_GRAMMAR], [AT_USER_ACTION_INPUT], [['b']], [[none]]) # Canonical LR doesn't foresee the error for 'a'! -AT_CONSISTENT_ERRORS_CHECK([[%define lr.default-reductions accepting]], +AT_CONSISTENT_ERRORS_CHECK([[%define lr.default-reduction accepting]], [AT_USER_ACTION_GRAMMAR], [AT_USER_ACTION_INPUT], [[$end]], [[a]]) @@ -416,7 +642,7 @@ AT_CONSISTENT_ERRORS_CHECK([[%define parse.lac full]], [AT_USER_ACTION_INPUT], [['b']], [[none]]) AT_CONSISTENT_ERRORS_CHECK([[%define parse.lac full - %define lr.default-reductions accepting]], + %define lr.default-reduction accepting]], [AT_USER_ACTION_GRAMMAR], [AT_USER_ACTION_INPUT], [[$end]], [[none]]) @@ -486,13 +712,8 @@ reduce-nonassoc: %prec 'a'; %% ]AT_YYERROR_DEFINE[ ]AT_YYLEX_DEFINE(["aaa"])[ - -int -main (void) -{ - return yyparse (); -} -]]) +]AT_MAIN_DEFINE +]) AT_BISON_OPTION_POPDEFS # Show canonical LR's failure. @@ -574,7 +795,7 @@ exp (6) on left: 1 2, on right: 0 1 -state 0 +State 0 0 $accept: . exp $end 1 exp: . exp OP exp @@ -585,14 +806,14 @@ state 0 exp go to state 2 -state 1 +State 1 2 exp: NUM . $default reduce using rule 2 (exp) -state 2 +State 2 0 $accept: exp . $end 1 exp: exp . OP exp @@ -601,14 +822,14 @@ state 2 OP shift, and go to state 4 -state 3 +State 3 0 $accept: exp $end . $default accept -state 4 +State 4 1 exp: . exp OP exp 1 | exp OP . exp @@ -619,7 +840,7 @@ state 4 exp go to state 5 -state 5 +State 5 1 exp: exp . OP exp 1 | exp OP exp . [$end, OP] @@ -677,7 +898,7 @@ exp (6) on left: 1 2, on right: 0 1 -state 0 +State 0 0 $accept: . exp $end 1 exp: . exp OP exp @@ -688,14 +909,14 @@ state 0 exp go to state 2 -state 1 +State 1 2 exp: NUM . $default reduce using rule 2 (exp) -state 2 +State 2 0 $accept: exp . $end 1 exp: exp . OP exp @@ -704,14 +925,14 @@ state 2 OP shift, and go to state 4 -state 3 +State 3 0 $accept: exp $end . $default accept -state 4 +State 4 1 exp: . exp OP exp 1 | exp OP . exp @@ -722,7 +943,7 @@ state 4 exp go to state 5 -state 5 +State 5 1 exp: exp . OP exp 1 | exp OP exp . [$end, OP] @@ -785,7 +1006,7 @@ cond: AT_BISON_CHECK([-o input.c input.y], 0, [], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] -input.y:12.3-18: warning: rule useless in parser due to conflicts: cond: cond "then" cond [-Wother] +input.y:12.3-18: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP @@ -801,13 +1022,13 @@ AT_CLEANUP # $end reduce using rule 3 (num) # $end [reduce using rule 4 (id)] # -# But when `reduce 3' is the default action, we'd produce: +# 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: +# reduction), we make the 'reduce 3' explicit: # # $end reduce using rule 3 (num) # $end [reduce using rule 4 (id)] @@ -829,7 +1050,7 @@ id : '0'; AT_BISON_CHECK([-o input.c --report=all input.y], 0, [], [[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] -input.y:4.6-8: warning: rule useless in parser due to conflicts: id: '0' [-Wother] +input.y:4.6-8: warning: rule useless in parser due to conflicts [-Wother] ]]) # Check the contents of the report. @@ -873,7 +1094,7 @@ id (7) on left: 4, on right: 2 -state 0 +State 0 0 $accept: . exp $end 1 exp: . num @@ -888,7 +1109,7 @@ state 0 id go to state 4 -state 1 +State 1 3 num: '0' . [$end] 4 id: '0' . [$end] @@ -898,28 +1119,28 @@ state 1 $default reduce using rule 3 (num) -state 2 +State 2 0 $accept: exp . $end $end shift, and go to state 5 -state 3 +State 3 1 exp: num . $default reduce using rule 1 (exp) -state 4 +State 4 2 exp: id . $default reduce using rule 2 (exp) -state 5 +State 5 0 $accept: exp $end . @@ -945,7 +1166,7 @@ exp: exp OP exp | NUM; ]]) AT_BISON_CHECK([-o input.c input.y], 1, [], -[[input.y: shift/reduce conflicts: 1 found, 0 expected +[[input.y: error: shift/reduce conflicts: 1 found, 0 expected ]]) AT_CLEANUP @@ -981,7 +1202,7 @@ exp: exp OP exp | NUM; ]]) AT_BISON_CHECK([-o input.c input.y], 1, [], -[[input.y: shift/reduce conflicts: 1 found, 2 expected +[[input.y: error: shift/reduce conflicts: 1 found, 2 expected ]]) AT_CLEANUP @@ -1000,7 +1221,7 @@ a: 'a'; ]]) AT_BISON_CHECK([-o input.c input.y], 1, [], -[[input.y: reduce/reduce conflicts: 1 found, 0 expected +[[input.y: error: reduce/reduce conflicts: 1 found, 0 expected ]]) AT_CLEANUP @@ -1042,8 +1263,10 @@ e: e '+' e ; ]]) -AT_BISON_CHECK([-o input.c input.y], 0, [], +AT_BISON_CHECK([-Wall -o input.c input.y], 0, [], [[input.y: warning: 4 shift/reduce conflicts [-Wconflicts-sr] +input.y:1.7-9: warning: useless precedence and associativity for '+' [-Wprecedence] +input.y:2.7-9: warning: useless precedence and associativity for '*' [-Wprecedence] ]]) AT_CLEANUP @@ -1147,13 +1370,13 @@ reported_conflicts: AT_BISON_CHECK([[--report=all input.y]], 0, [], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] -input.y:12.5-20: warning: rule useless in parser due to conflicts: resolved_conflict: 'a' unreachable1 [-Wother] -input.y:20.5-20: warning: rule useless in parser due to conflicts: unreachable1: 'a' unreachable2 [-Wother] -input.y:21.4: warning: rule useless in parser due to conflicts: unreachable1: /* empty */ [-Wother] -input.y:25.13: warning: rule useless in parser due to conflicts: unreachable2: /* empty */ [-Wother] -input.y:25.16: warning: rule useless in parser due to conflicts: unreachable2: /* empty */ [-Wother] -input.y:31.5-7: warning: rule useless in parser due to conflicts: reported_conflicts: 'a' [-Wother] -input.y:32.4: warning: rule useless in parser due to conflicts: reported_conflicts: /* empty */ [-Wother] +input.y:12.5-20: warning: rule useless in parser due to conflicts [-Wother] +input.y:20.5-20: warning: rule useless in parser due to conflicts [-Wother] +input.y:21.4: warning: rule useless in parser due to conflicts [-Wother] +input.y:25.13: warning: rule useless in parser due to conflicts [-Wother] +input.y:25.16: warning: rule useless in parser due to conflicts [-Wother] +input.y:31.5-7: warning: rule useless in parser due to conflicts [-Wother] +input.y:32.4: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CHECK([[cat input.output]], 0, @@ -1162,13 +1385,13 @@ AT_CHECK([[cat input.output]], 0, 2 resolved_conflict: 'a' unreachable1 4 unreachable1: 'a' unreachable2 - 5 | /* empty */ + 5 | %empty - 6 unreachable2: /* empty */ - 7 | /* empty */ + 6 unreachable2: %empty + 7 | %empty 9 reported_conflicts: 'a' - 10 | /* empty */ + 10 | %empty State 4 conflicts: 1 shift/reduce @@ -1182,17 +1405,17 @@ Grammar 1 start: resolved_conflict 'a' reported_conflicts 'a' 2 resolved_conflict: 'a' unreachable1 - 3 | /* empty */ + 3 | %empty 4 unreachable1: 'a' unreachable2 - 5 | /* empty */ + 5 | %empty - 6 unreachable2: /* empty */ - 7 | /* empty */ + 6 unreachable2: %empty + 7 | %empty 8 reported_conflicts: 'a' 9 | 'a' - 10 | /* empty */ + 10 | %empty Terminals, with rules where they appear @@ -1218,7 +1441,7 @@ reported_conflicts (9) on left: 8 9 10, on right: 1 -state 0 +State 0 0 $accept: . start $end 1 start: . resolved_conflict 'a' reported_conflicts 'a' @@ -1233,28 +1456,28 @@ state 0 Conflict between rule 3 and token 'a' resolved as reduce (%left 'a'). -state 1 +State 1 0 $accept: start . $end $end shift, and go to state 3 -state 2 +State 2 1 start: resolved_conflict . 'a' reported_conflicts 'a' 'a' shift, and go to state 4 -state 3 +State 3 0 $accept: start $end . $default accept -state 4 +State 4 1 start: resolved_conflict 'a' . reported_conflicts 'a' 8 reported_conflicts: . 'a' @@ -1268,7 +1491,7 @@ state 4 reported_conflicts go to state 6 -state 5 +State 5 8 reported_conflicts: 'a' . ['a'] 9 | 'a' . ['a'] @@ -1278,14 +1501,14 @@ state 5 $default reduce using rule 8 (reported_conflicts) -state 6 +State 6 1 start: resolved_conflict 'a' reported_conflicts . 'a' 'a' shift, and go to state 7 -state 7 +State 7 1 start: resolved_conflict 'a' reported_conflicts 'a' . @@ -1293,17 +1516,17 @@ state 7 ]]) AT_DATA([[input-keep.y]], -[[%define lr.keep-unreachable-states +[[%define lr.keep-unreachable-state ]]) AT_CHECK([[cat input.y >> input-keep.y]]) AT_BISON_CHECK([[input-keep.y]], 0, [], [[input-keep.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr] input-keep.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr] -input-keep.y:22.4: warning: rule useless in parser due to conflicts: unreachable1: /* empty */ [-Wother] -input-keep.y:26.16: warning: rule useless in parser due to conflicts: unreachable2: /* empty */ [-Wother] -input-keep.y:32.5-7: warning: rule useless in parser due to conflicts: reported_conflicts: 'a' [-Wother] -input-keep.y:33.4: warning: rule useless in parser due to conflicts: reported_conflicts: /* empty */ [-Wother] +input-keep.y:22.4: warning: rule useless in parser due to conflicts [-Wother] +input-keep.y:26.16: warning: rule useless in parser due to conflicts [-Wother] +input-keep.y:32.5-7: warning: rule useless in parser due to conflicts [-Wother] +input-keep.y:33.4: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP @@ -1340,8 +1563,8 @@ empty_c2: %prec 'c' ; empty_c3: %prec 'd' ; ]]) AT_BISON_CHECK([[--report=all -o input.c input.y]], 0, [], [ignore]) -AT_CHECK([[cat input.output | sed -n '/^state 0$/,/^state 1$/p']], 0, -[[state 0 +AT_CHECK([[cat input.output | sed -n '/^State 0$/,/^State 1$/p']], 0, +[[State 0 0 $accept: . start $end 1 start: . 'a' @@ -1377,7 +1600,7 @@ AT_CHECK([[cat input.output | sed -n '/^state 0$/,/^state 1$/p']], 0, Conflict between rule 13 and token 'c' resolved as reduce ('c' < 'd'). -state 1 +State 1 ]]) AT_CLEANUP @@ -1416,8 +1639,8 @@ empty_c3: %prec 'c' ; ]]) AT_BISON_CHECK([[--report=all -o input.c input.y]], 0, [], [ignore]) -AT_CHECK([[cat input.output | sed -n '/^state 0$/,/^state 1$/p']], 0, -[[state 0 +AT_CHECK([[cat input.output | sed -n '/^State 0$/,/^State 1$/p']], 0, +[[State 0 0 $accept: . start $end 1 start: . 'a' @@ -1453,7 +1676,7 @@ AT_CHECK([[cat input.output | sed -n '/^state 0$/,/^state 1$/p']], 0, Conflict between rule 11 and token 'c' resolved as an error (%nonassoc 'c'). -state 1 +State 1 ]]) AT_CLEANUP @@ -1483,7 +1706,7 @@ exp: 'a' | 'a'; AT_BISON_CHECK([[2.y]], [[0]], [], [[2.y: warning: %expect-rr applies only to GLR parsers [-Wother] 2.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] -2.y:3.12-14: warning: rule useless in parser due to conflicts: exp: 'a' [-Wother] +2.y:3.12-14: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP @@ -1584,12 +1807,12 @@ for gram in sr-rr sr rr; do if test -z "$sr_exp_i" && test "$sr_count" -ne 0; then echo "warning: $sr_count shift/reduce conflicts" elif test "$sr_exp_i" -ne "$sr_count"; then - echo "shift/reduce conflicts: $sr_count found, $sr_exp_i expected" + echo "error: shift/reduce conflicts: $sr_count found, $sr_exp_i expected" fi if test -z "$rr_exp_i" && test "$rr_count" -ne 0; then echo "warning: $rr_count reduce/reduce conflicts" elif test "$rr_exp_i" -ne "$rr_count"; then - echo "reduce/reduce conflicts: $rr_count found, $rr_exp_i expected" + echo "error: reduce/reduce conflicts: $rr_count found, $rr_exp_i expected" fi } | sed -e "s/^/$file: /" > experr ]AT_BISON_CHECK([[-Wnone $file]], [[1]], [[]], [[experr]])[