mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-15 23:33:03 +00:00
Now that the derivation is no longer printed on one line, aligning the example and the derivation is no longer useful. It can actually be harmful, as it makes the overall structure less clear. * src/derivation.h, src/derivation.c (derivation_print_leaves): Remove the `prefix` argument. * src/counterexample.c (print_counterexample): Put the example next to its label. * tests/conflicts.at, tests/counterexample.at, tests/diagnostics.at, * tests/report.at: Adjust.
923 lines
26 KiB
Plaintext
923 lines
26 KiB
Plaintext
# 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 <http://www.gnu.org/licenses/>.
|
|
|
|
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 derivation
|
|
a
|
|
`-> A b .
|
|
Second 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 derivation a -> [ A b . ]
|
|
Second 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 derivation
|
|
$accept
|
|
`-> s $end
|
|
`-> a A
|
|
`-> D .
|
|
Second example: B D . A $end
|
|
Second 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 derivation $accept -> [ s -> [ a -> [ D . ] A ] $end ]
|
|
Second example B D . A $end
|
|
Second 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 derivation
|
|
S
|
|
`-> B C
|
|
`-> A b A `-> A c A
|
|
`-> B . `-> %empty `-> %empty `-> %empty
|
|
Second 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 derivation
|
|
S
|
|
`-> C B
|
|
`-> A c A `-> A b A
|
|
`-> C . `-> %empty `-> %empty `-> %empty
|
|
Second 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 derivation S -> [ B -> [ A -> [ B . ] b A -> [ ] ] C -> [ A -> [ ] c A -> [ ] ] ]
|
|
Second 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 derivation S -> [ C -> [ A -> [ C . ] c A -> [ ] ] B -> [ A -> [ ] b A -> [ ] ] ]
|
|
Second 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 derivation
|
|
$accept
|
|
`-> a $end
|
|
`-> b d
|
|
`-> . `-> c A A
|
|
Second example: . c A A $end
|
|
Second 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 derivation
|
|
$accept
|
|
`-> a $end
|
|
`-> b d
|
|
`-> a
|
|
`-> b d
|
|
`-> . `-> c A A
|
|
Second example: b . A $end
|
|
Second 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 derivation
|
|
$accept
|
|
`-> a $end
|
|
`-> c d
|
|
`-> a
|
|
`-> b d
|
|
`-> . `-> c A A
|
|
Second example: c . A $end
|
|
Second 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 derivation
|
|
$accept
|
|
`-> a $end
|
|
`-> b d
|
|
`-> a
|
|
`-> c d
|
|
`-> a
|
|
`-> b d
|
|
`-> . `-> c A A
|
|
Second example: b c . A $end
|
|
Second 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 derivation
|
|
a
|
|
`-> b d .
|
|
Second derivation
|
|
a
|
|
`-> b d
|
|
`-> d .
|
|
input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples]
|
|
Example: c d .
|
|
First derivation
|
|
a
|
|
`-> c d .
|
|
Second 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 derivation $accept -> [ a -> [ b -> [ . ] d -> [ c A A ] ] $end ]
|
|
Second example . c A A $end
|
|
Second 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 derivation $accept -> [ a -> [ b d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] $end ]
|
|
Second example b . A $end
|
|
Second 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 derivation $accept -> [ a -> [ c d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] $end ]
|
|
Second example c . A $end
|
|
Second 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 derivation $accept -> [ a -> [ b d -> [ a -> [ c d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] ] ] $end ]
|
|
Second example b c . A $end
|
|
Second 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 derivation a -> [ b d . ]
|
|
Second derivation a -> [ b d -> [ d . ] ]
|
|
input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples]
|
|
Example c d .
|
|
First derivation a -> [ c d . ]
|
|
Second 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
|