X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/284bc49c832ffe6280907cb6c7788fa06bc58c7c..75fbe357c896d84b9dedff98c8b0d43ca536bc95:/tests/conflicts.at diff --git a/tests/conflicts.at b/tests/conflicts.at index d2fb298d..d320442d 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -1,6 +1,6 @@ # Exercising Bison on conflicts. -*- Autotest -*- -# Copyright (C) 2002-2005, 2007-2013 Free Software Foundation, Inc. +# Copyright (C) 2002-2005, 2007-2015 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,10 +17,9 @@ AT_BANNER([[Conflicts.]]) - -## ------------------------ ## -## Token declaration order. ## -## ------------------------ ## +## ------------------------- ## +## Token declaration order. ## +## ------------------------- ## # This test checks that token are declared left to right when in a precedence # statement. @@ -78,14 +77,7 @@ int main (void) } ]]) -AT_BISON_CHECK([-o input.c input.y], [], [], -[[input.y:24.13: warning: useless precedence for R [-Wother] -input.y:24.15: warning: useless precedence for S [-Wother] -input.y:24.17: warning: useless precedence for T [-Wother] -input.y:24.19: warning: useless precedence for U [-Wother] -input.y:25.13: warning: useless precedence for V [-Wother] -input.y:25.15: warning: useless precedence for W [-Wother] -]]) +AT_BISON_CHECK([-o input.c input.y]) AT_COMPILE([input]) AT_PARSER_CHECK([./input]) @@ -95,6 +87,127 @@ 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]], +[[%token EQ "=" PL "+" ST "*" LP "(" +%nonassoc "=" +%left "+" +%left "*" +%precedence "(" +%% +stmt: + exp +| "var" "=" exp +; + +exp: + exp "+" exp +| exp "*" "num" +| "(" exp ")" +| "num" +; +]]) + +AT_BISON_CHECK([-Wprecedence input.y], 0, [], +[[input.y:2.1-9: warning: useless precedence and associativity for "=" [-Wprecedence] +input.y:4.1-5: warning: useless associativity for "*", use %precedence [-Wprecedence] +input.y:5.1-11: warning: useless precedence for "(" [-Wprecedence] +]]) + +AT_CLEANUP + + ## ---------------------------- ## ## Useless precedence warning. ## ## ---------------------------- ## @@ -102,7 +215,7 @@ AT_CLEANUP AT_SETUP([Useless precedence warning]) AT_DATA([[input.y]], -[[%token A B +[[%token A B U V W X Y Z %precedence Z %left X %precedence Y @@ -129,10 +242,19 @@ f: B ; ]]) -AT_BISON_CHECK([-fcaret -o input.c input.y], 0, [], -[[input.y:2.13: warning: useless precedence for Z [-Wother] +AT_BISON_CHECK([-Wprecedence -fcaret -o input.c input.y], 0, [], +[[input.y:7.1-9: warning: useless precedence and associativity for U [-Wprecedence] + %nonassoc U + ^^^^^^^^^ +input.y:6.1-6: warning: useless precedence and associativity for V [-Wprecedence] + %right V + ^^^^^^ +input.y:5.1-5: warning: useless precedence and associativity for W [-Wprecedence] + %left W + ^^^^^ +input.y:2.1-11: warning: useless precedence for Z [-Wprecedence] %precedence Z - ^ + ^^^^^^^^^^^ ]]) AT_CLEANUP @@ -157,7 +279,7 @@ 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, [], @@ -271,10 +393,10 @@ AT_CLEANUP ## parse.error=verbose and consistent errors. ## ## ------------------------------------------- ## -AT_SETUP([[parse.error=verbose and consistent errors]]) - m4_pushdef([AT_CONSISTENT_ERRORS_CHECK], [ +AT_SETUP([[parse.error=verbose and consistent errors: ]$1]) + AT_BISON_OPTION_PUSHDEFS([$1]) m4_pushdef([AT_YYLEX_PROTOTYPE], @@ -361,7 +483,11 @@ m4_popdef([AT_EXPECTING]) m4_popdef([AT_YYLEX_PROTOTYPE]) AT_BISON_OPTION_POPDEFS -]) +AT_CLEANUP +]) dnl AT_CONSISTENT_ERRORS_CHECK + + + m4_pushdef([AT_PREVIOUS_STATE_GRAMMAR], [[%nonassoc 'a'; @@ -531,7 +657,6 @@ m4_popdef([AT_USER_ACTION_INPUT]) m4_popdef([AT_CONSISTENT_ERRORS_CHECK]) -AT_CLEANUP @@ -885,7 +1010,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 @@ -901,13 +1026,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)] @@ -929,7 +1054,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. @@ -1142,8 +1267,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.1-5: warning: useless precedence and associativity for '+' [-Wprecedence] +input.y:2.1-5: warning: useless precedence and associativity for '*' [-Wprecedence] ]]) AT_CLEANUP @@ -1247,13 +1374,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, @@ -1262,13 +1389,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 @@ -1282,17 +1409,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 @@ -1323,7 +1450,7 @@ State 0 0 $accept: . start $end 1 start: . resolved_conflict 'a' reported_conflicts 'a' 2 resolved_conflict: . 'a' unreachable1 - 3 | . ['a'] + 3 | . %empty ['a'] $default reduce using rule 3 (resolved_conflict) @@ -1359,7 +1486,7 @@ State 4 1 start: resolved_conflict 'a' . reported_conflicts 'a' 8 reported_conflicts: . 'a' 9 | . 'a' - 10 | . ['a'] + 10 | . %empty ['a'] 'a' shift, and go to state 5 @@ -1400,10 +1527,10 @@ 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 @@ -1452,11 +1579,11 @@ AT_CHECK([[cat input.output | sed -n '/^State 0$/,/^State 1$/p']], 0, 6 | . empty_c1 'c' 7 | . empty_c2 'c' 8 | . empty_c3 'c' - 9 empty_a: . ['a'] - 10 empty_b: . [] - 11 empty_c1: . [] - 12 empty_c2: . [] - 13 empty_c3: . ['c'] + 9 empty_a: . %empty ['a'] + 10 empty_b: . %empty [] + 11 empty_c1: . %empty [] + 12 empty_c2: . %empty [] + 13 empty_c3: . %empty ['c'] 'b' shift, and go to state 1 @@ -1528,11 +1655,11 @@ AT_CHECK([[cat input.output | sed -n '/^State 0$/,/^State 1$/p']], 0, 6 | . empty_c1 'c' 7 | . empty_c2 'c' 8 | . empty_c3 'c' - 9 empty_a: . [] - 10 empty_b: . [] - 11 empty_c1: . [] - 12 empty_c2: . ['c'] - 13 empty_c3: . ['c'] + 9 empty_a: . %empty [] + 10 empty_b: . %empty [] + 11 empty_c1: . %empty [] + 12 empty_c2: . %empty ['c'] + 13 empty_c3: . %empty ['c'] 'a' error (nonassociative) 'b' error (nonassociative) @@ -1583,7 +1710,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