# Exercising Bison on counterexamples. -*- Autotest -*- # Copyright (C) 2020 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 # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . AT_BANNER([[Counterexamples.]]) # AT_BISON_CHECK_CEX(TREE, FLAT) # ------------------------------ m4_define([AT_BISON_CHECK_CEX], [AT_KEYWORDS([cex]) AT_BISON_CHECK([-Wcounterexamples input.y], [0], [], [stderr]) # FIXME: Avoid trailing white spaces. AT_CHECK([[sed -e 's/time limit exceeded: [0-9][.0-9]*/time limit exceeded: XXX/g;s/ *$//;' stderr]], [], [$1]) m4_pushdef([AT_SET_ENV_IF], [[YYFLAT=1; export YYFLAT;]]m4_defn([AT_SET_ENV_IF])) AT_BISON_CHECK([-Wcounterexamples input.y], [0], [], [stderr]) AT_CHECK([[sed -e 's/time limit exceeded: [0-9][.0-9]*/time limit exceeded: XXX/g' stderr]], [], [$2]) m4_popdef([AT_SET_ENV_IF]) ]) ## --------------------- ## ## Simple Unifying S/R. ## ## --------------------- ## AT_SETUP([Unifying S/R]) AT_DATA([[input.y]], [[%token A B C %% s: a x | y c; a: A; c: C; x: B | B C; y: A | A B; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] Example: A . B C Shift derivation s `-> y c `-> A . B `-> C Reduce derivation s `-> a x `-> A . `-> B C input.y:4.4: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] Example A . B C Shift derivation s -> [ y -> [ A . B ] c -> [ C ] ] Reduce derivation s -> [ a -> [ A . ] x -> [ B C ] ] input.y:4.4: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP ## ------------------- ## ## Deep Unifying S/R. ## ## ------------------- ## AT_SETUP([Deep Unifying S/R]) AT_DATA([[input.y]], [[%token A B C %% s: ac | a bc; ac: A ac C | b; b: B | B b; a: A | A a; bc: B bc C | B C; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] Example: A . B C Shift derivation s `-> ac `-> A ac C `-> b `-> . B Reduce derivation s `-> a bc `-> A . `-> B C input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] Example: A A . B B C C Shift derivation s `-> ac `-> A ac C `-> A ac C `-> b `-> . b `-> B B Reduce derivation s `-> a bc `-> A a `-> B bc C `-> A . `-> B C input.y:6.4: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] Example A . B C Shift derivation s -> [ ac -> [ A ac -> [ b -> [ . B ] ] C ] ] Reduce derivation s -> [ a -> [ A . ] bc -> [ B C ] ] input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] Example A A . B B C C Shift derivation s -> [ ac -> [ A ac -> [ A ac -> [ b -> [ . b -> [ B B ] ] ] C ] C ] ] Reduce derivation s -> [ a -> [ A a -> [ A . ] ] bc -> [ B bc -> [ B C ] C ] ] input.y:6.4: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP ## ------------------------------------ ## ## S/R Conflict with Nullable Symbols. ## ## ------------------------------------ ## AT_SETUP([S/R Conflict with Nullable Symbols]) AT_DATA([[input.y]], [[%token A B X Y %% s: ax by | A xby; ax: A x; x: %empty | X x; by: B y; y: %empty | Y y; xby: B | X xby Y; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] Example: A . B Shift derivation s `-> A xby `-> . B Reduce derivation s `-> ax by `-> A x `-> B y `-> . `-> %empty input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] First example: A X . B Y $end Shift derivation $accept `-> s $end `-> A xby `-> X xby Y `-> . B Second example: A X . B y $end Reduce derivation $accept `-> s $end `-> ax by `-> A x `-> B y `-> X x `-> . input.y:5.4-9: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] Example A . B Shift derivation s -> [ A xby -> [ . B ] ] Reduce derivation s -> [ ax -> [ A x -> [ . ] ] by -> [ B y -> [ ] ] ] input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] First example A X . B Y $end Shift derivation $accept -> [ s -> [ A xby -> [ X xby -> [ . B ] Y ] ] $end ] Second example A X . B y $end Reduce derivation $accept -> [ s -> [ ax -> [ A x -> [ X x -> [ . ] ] ] by -> [ B y ] ] $end ] input.y:5.4-9: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP ## ---------------------------- ## ## Non-unifying Ambiguous S/R. ## ## ---------------------------- ## AT_SETUP([Non-unifying Ambiguous S/R]) AT_DATA([[input.y]], [[%token A B C D E %% g: s | x; s: A x E | A x D E; x: b cd | bc; b: B; cd: C D; bc: B C; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token C [-Wcounterexamples] First example: B . C $end Shift derivation $accept `-> g $end `-> x `-> bc `-> B . C Second example: B . C D $end Reduce derivation $accept `-> g $end `-> x `-> b cd `-> B . `-> C D input.y:6.4: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token C [-Wcounterexamples] First example B . C $end Shift derivation $accept -> [ g -> [ x -> [ bc -> [ B . C ] ] ] $end ] Second example B . C D $end Reduce derivation $accept -> [ g -> [ x -> [ b -> [ B . ] cd -> [ C D ] ] ] $end ] input.y:6.4: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP ## ------------------------------ ## ## Non-unifying Unambiguous S/R. ## ## ------------------------------ ## AT_SETUP([Non-unifying Unambiguous S/R]) AT_DATA([[input.y]], [[%token A B %% s: t | s t; t: x | y; x: A; y: A A B; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token A [-Wcounterexamples] First example: A . A B $end Shift derivation $accept `-> s $end `-> t `-> y `-> A . A B Second example: A . A $end Reduce derivation $accept `-> s $end `-> s t `-> t `-> x `-> x `-> A `-> A . ]], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token A [-Wcounterexamples] First example A . A B $end Shift derivation $accept -> [ s -> [ t -> [ y -> [ A . A B ] ] ] $end ] Second example A . A $end Reduce derivation $accept -> [ s -> [ s -> [ t -> [ x -> [ A . ] ] ] t -> [ x -> [ A ] ] ] $end ] ]]) AT_CLEANUP ## ----------------------- ## ## S/R after first token. ## ## ----------------------- ## AT_SETUP([S/R after first token]) AT_DATA([[input.y]], [[%token A B X Y %% a: r t | s; r: b; b: B; t: A xx | A x xy; s: b A xx y; x: X; xx: X X; xy: X Y; y: Y; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token A [-Wcounterexamples] Example: b . A X X Y Shift derivation a `-> s `-> b . xx y `-> A X X `-> Y Reduce derivation a `-> r t `-> b . `-> A x xy `-> X `-> X Y input.y: warning: shift/reduce conflict on token X [-Wcounterexamples] First example: A X . X Shift derivation a `-> t `-> A xx `-> X . X Second example: X . X xy Reduce derivation a `-> x t `-> X . `-> X xy input.y:4.4: warning: rule useless in parser due to conflicts [-Wother] input.y:8.4: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token A [-Wcounterexamples] Example b . A X X Y Shift derivation a -> [ s -> [ b . xx -> [ A X X ] y -> [ Y ] ] ] Reduce derivation a -> [ r -> [ b . ] t -> [ A x -> [ X ] xy -> [ X Y ] ] ] input.y: warning: shift/reduce conflict on token X [-Wcounterexamples] First example A X . X Shift derivation a -> [ t -> [ A xx -> [ X . X ] ] ] Second example X . X xy Reduce derivation a -> [ x -> [ X . ] t -> [ X xy ] ] input.y:4.4: warning: rule useless in parser due to conflicts [-Wother] input.y:8.4: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP ## ----------------------------- ## ## Unifying R/R counterexample. ## ## ----------------------------- ## AT_SETUP([Unifying R/R counterexample]) AT_DATA([[input.y]], [[%token A %% a : A b ; b : A | b; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples] Example: A b . First reduce derivation a `-> A b . Second reduce derivation a `-> A b `-> b . input.y:4.9: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples] Example A b . First reduce derivation a -> [ A b . ] Second reduce derivation a -> [ A b -> [ b . ] ] input.y:4.9: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP ## --------------------------------- ## ## Non-unifying R/R LR(1) conflict. ## ## --------------------------------- ## AT_SETUP([Non-unifying R/R LR(1) conflict]) AT_DATA([[input.y]], [[%token A B C D %% s: a A | B a C | b C | B b A; a: D; b: D; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr] input.y: warning: reduce/reduce conflict on tokens A, C [-Wcounterexamples] First example: D . A $end First reduce derivation $accept `-> s $end `-> a A `-> D . Second example: B D . A $end Second reduce derivation $accept `-> s $end `-> B b A `-> D . input.y:5.4: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr] input.y: warning: reduce/reduce conflict on tokens A, C [-Wcounterexamples] First example D . A $end First reduce derivation $accept -> [ s -> [ a -> [ D . ] A ] $end ] Second example B D . A $end Second reduce derivation $accept -> [ s -> [ B b -> [ D . ] A ] $end ] input.y:5.4: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP ## --------------------------------- ## ## Non-unifying R/R LR(2) conflict. ## ## --------------------------------- ## AT_SETUP([Non-unifying R/R LR(2) conflict]) AT_DATA([[input.y]], [[%token H J K X %% s: a J; a: H i; i: X | i J K; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token J [-Wcounterexamples] time limit exceeded: XXX First example: H i . J K $end Shift derivation $accept `-> a $end `-> H i `-> i . J K Second example: H i . J $end Reduce derivation $accept `-> s $end `-> a J `-> H i . input.y:4.4-6: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token J [-Wcounterexamples] time limit exceeded: XXX First example H i . J K $end Shift derivation $accept -> [ a -> [ H i -> [ i . J K ] ] $end ] Second example H i . J $end Reduce derivation $accept -> [ s -> [ a -> [ H i . ] J ] $end ] input.y:4.4-6: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP ## -------------------- ## ## Cex Search Prepend. ## ## -------------------- ## # Tests prepend steps in uniying counterexample # graph search AT_SETUP([Cex Search Prepend]) AT_DATA([[input.y]], [[%token N A B C D %% s: n | n C; n: N n D | N n C | N a B | N b; a: A; b: A B C | A B D; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] Example: N A . B C Shift derivation s `-> n `-> N b `-> A . B C Reduce derivation s `-> n C `-> N a B `-> A . input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] Example: N N A . B D C Shift derivation s `-> n `-> N n C `-> N b `-> A . B D Reduce derivation s `-> n C `-> N n D `-> N a B `-> A . input.y:5.4: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] Example N A . B C Shift derivation s -> [ n -> [ N b -> [ A . B C ] ] ] Reduce derivation s -> [ n -> [ N a -> [ A . ] B ] C ] input.y: warning: shift/reduce conflict on token B [-Wcounterexamples] Example N N A . B D C Shift derivation s -> [ n -> [ N n -> [ N b -> [ A . B D ] ] C ] ] Reduce derivation s -> [ n -> [ N n -> [ N a -> [ A . ] B ] D ] C ] input.y:5.4: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP ## ------------------- ## ## R/R cex with prec. ## ## ------------------- ## # Tests that counterexamples containing rules using # precedence/associativity directives work. AT_SETUP([R/R cex with prec]) AT_DATA([[input.y]], [[%left b %right c %% S: B C | C B; A : B | C | %empty; B : A b A; C : A c A; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 4 reduce/reduce conflicts [-Wconflicts-rr] input.y: warning: reduce/reduce conflict on tokens b, c [-Wcounterexamples] Example: B . b c First reduce derivation S `-> B C `-> A b A `-> A c A `-> B . `-> %empty `-> %empty `-> %empty Second reduce derivation S `-> B C `-> A c A `-> B `-> %empty `-> A b A `-> . `-> %empty input.y: warning: reduce/reduce conflict on tokens b, c [-Wcounterexamples] Example: C . c b First reduce derivation S `-> C B `-> A c A `-> A b A `-> C . `-> %empty `-> %empty `-> %empty Second reduce derivation S `-> C B `-> A b A `-> C `-> %empty `-> A c A `-> . `-> %empty ]], [[input.y: warning: 4 reduce/reduce conflicts [-Wconflicts-rr] input.y: warning: reduce/reduce conflict on tokens b, c [-Wcounterexamples] Example B . b c First reduce derivation S -> [ B -> [ A -> [ B . ] b A -> [ ] ] C -> [ A -> [ ] c A -> [ ] ] ] Second reduce derivation S -> [ B C -> [ A -> [ B -> [ A -> [ . ] b A -> [ ] ] ] c A -> [ ] ] ] input.y: warning: reduce/reduce conflict on tokens b, c [-Wcounterexamples] Example C . c b First reduce derivation S -> [ C -> [ A -> [ C . ] c A -> [ ] ] B -> [ A -> [ ] b A -> [ ] ] ] Second reduce derivation S -> [ C B -> [ A -> [ C -> [ A -> [ . ] c A -> [ ] ] ] b A -> [ ] ] ] ]]) AT_CLEANUP ## ------------------- ## ## Null nonterminals. ## ## ------------------- ## AT_SETUP([Null nonterminals]) AT_DATA([[input.y]], [[%token A %% a : b d | c d ; b : ; c : ; d : a | c A | d; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: 6 reduce/reduce conflicts [-Wconflicts-rr] input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] First example: . c A A $end First reduce derivation $accept `-> a $end `-> b d `-> . `-> c A A Second example: . c A A $end Second reduce derivation $accept `-> a $end `-> c d `-> . `-> c A A input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] time limit exceeded: XXX First example: b . c A A $end First reduce derivation $accept `-> a $end `-> b d `-> a `-> b d `-> . `-> c A A Second example: b . A $end Second reduce derivation $accept `-> a $end `-> b d `-> c A `-> . input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] time limit exceeded: XXX First example: c . c A A $end First reduce derivation $accept `-> a $end `-> c d `-> a `-> b d `-> . `-> c A A Second example: c . A $end Second reduce derivation $accept `-> a $end `-> c d `-> c A `-> . input.y: warning: shift/reduce conflict on token A [-Wcounterexamples] time limit exceeded: XXX First example: b c . A Shift derivation a `-> b d `-> c . A Second example: b c . c A A $end Reduce derivation $accept `-> a $end `-> b d `-> a `-> c d `-> a `-> b d `-> . `-> c A A input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] First example: b c . c A A $end First reduce derivation $accept `-> a $end `-> b d `-> a `-> c d `-> a `-> b d `-> . `-> c A A Second example: b c . A $end Second reduce derivation $accept `-> a $end `-> b d `-> a `-> c d `-> c A `-> . input.y: warning: shift/reduce conflict on token A [-Wcounterexamples] First example: b c . A Shift derivation a `-> b d `-> c . A Second example: b c . A $end Reduce derivation $accept `-> a $end `-> b d `-> a `-> c d `-> c A `-> . input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples] Example: b d . First reduce derivation a `-> b d . Second reduce derivation a `-> b d `-> d . input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples] Example: c d . First reduce derivation a `-> c d . Second reduce derivation a `-> c d `-> d . input.y:5.4: warning: rule useless in parser due to conflicts [-Wother] input.y:6.15: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: 6 reduce/reduce conflicts [-Wconflicts-rr] input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] First example . c A A $end First reduce derivation $accept -> [ a -> [ b -> [ . ] d -> [ c A A ] ] $end ] Second example . c A A $end Second reduce derivation $accept -> [ a -> [ c -> [ . ] d -> [ c A A ] ] $end ] input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] time limit exceeded: XXX First example b . c A A $end First reduce derivation $accept -> [ a -> [ b d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] $end ] Second example b . A $end Second reduce derivation $accept -> [ a -> [ b d -> [ c -> [ . ] A ] ] $end ] input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] time limit exceeded: XXX First example c . c A A $end First reduce derivation $accept -> [ a -> [ c d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] $end ] Second example c . A $end Second reduce derivation $accept -> [ a -> [ c d -> [ c -> [ . ] A ] ] $end ] input.y: warning: shift/reduce conflict on token A [-Wcounterexamples] time limit exceeded: XXX First example b c . A Shift derivation a -> [ b d -> [ c . A ] ] Second example b c . c A A $end Reduce derivation $accept -> [ a -> [ b d -> [ a -> [ c d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] ] ] $end ] input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] First example b c . c A A $end First reduce derivation $accept -> [ a -> [ b d -> [ a -> [ c d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] ] ] $end ] Second example b c . A $end Second reduce derivation $accept -> [ a -> [ b d -> [ a -> [ c d -> [ c -> [ . ] A ] ] ] ] $end ] input.y: warning: shift/reduce conflict on token A [-Wcounterexamples] First example b c . A Shift derivation a -> [ b d -> [ c . A ] ] Second example b c . A $end Reduce derivation $accept -> [ a -> [ b d -> [ a -> [ c d -> [ c -> [ . ] A ] ] ] ] $end ] input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples] Example b d . First reduce derivation a -> [ b d . ] Second reduce derivation a -> [ b d -> [ d . ] ] input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples] Example c d . First reduce derivation a -> [ c d . ] Second reduce derivation a -> [ c d -> [ d . ] ] input.y:5.4: warning: rule useless in parser due to conflicts [-Wother] input.y:6.15: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP ## --------------------------- ## ## Non-unifying Prefix Share. ## ## --------------------------- ## AT_SETUP([Non-unifying Prefix Share]) # Tests for a counterexample which should start its derivation # at a shared symbol rather than the start symbol. AT_DATA([[input.y]], [[%token H J %% s: a | a J; a: H i J J i: %empty | i J; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token J [-Wcounterexamples] Example: H i J . J J Shift derivation s `-> a J `-> H i J . J Reduce derivation s `-> a `-> H i J J `-> i J . input.y:5.13-15: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token J [-Wcounterexamples] Example H i J . J J Shift derivation s -> [ a -> [ H i J . J ] J ] Reduce derivation s -> [ a -> [ H i -> [ i J . ] J J ] ] input.y:5.13-15: warning: rule useless in parser due to conflicts [-Wother] ]]) AT_CLEANUP ## -------------------- ## ## Deep Null Unifying. ## ## ---------------------## # Tests that nested nullable nonterminals # are derived correctly. AT_SETUP([Deep Null Unifying]) AT_DATA([[input.y]], [[%token A D %% s: A a d | A a a d; a: b; b: c c: %empty d: D; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token D [-Wcounterexamples] Example: A a . D Shift derivation s `-> A a d `-> . D Reduce derivation s `-> A a a d `-> b `-> D `-> c `-> . ]], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token D [-Wcounterexamples] Example A a . D Shift derivation s -> [ A a d -> [ . D ] ] Reduce derivation s -> [ A a a -> [ b -> [ c -> [ . ] ] ] d -> [ D ] ] ]]) AT_CLEANUP ## ------------------------ ## ## Deep Null Non-unifying. ## ## -------------------------## # Tests that expand_to_conflict works with nullable sybols AT_SETUP([Deep Null Non-unifying]) AT_DATA([[input.y]], [[%token A D E %% s: A a d | A a a d E; a: b; b: c c: %empty d: D; ]]) AT_BISON_CHECK_CEX( [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token D [-Wcounterexamples] First example: A a . D $end Shift derivation $accept `-> s $end `-> A a d `-> . D Second example: A a . D E $end Reduce derivation $accept `-> s $end `-> A a a d E `-> b `-> D `-> c `-> . ]], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: shift/reduce conflict on token D [-Wcounterexamples] First example A a . D $end Shift derivation $accept -> [ s -> [ A a d -> [ . D ] ] $end ] Second example A a . D E $end Reduce derivation $accept -> [ s -> [ A a a -> [ b -> [ c -> [ . ] ] ] d -> [ D ] E ] $end ] ]]) AT_CLEANUP