%expect: tune the number of conflicts per rule

Currently on a grammar such as

    exp: "number" | exp "+" exp | exp "*" exp

we count only one sr-conflict for both binary rules, i.e., we expect:

    exp: "number" | exp "+" exp  %expect 1 | exp "*" exp  %expect 1

although there are 4 conflicts in total.  That's because in the states
in conflict, for instance that for the "+" rule:

    State 6

        2 exp: exp . "+" exp
        2    | exp "+" exp .  [$end, "+", "*"]
        3    | exp . "*" exp

        "+"  shift, and go to state 4
        "*"  shift, and go to state 5

        "+"       [reduce using rule 2 (exp)]
        "*"       [reduce using rule 2 (exp)]
        $default  reduce using rule 2 (exp)

we count only a single conflict, although there are two (one on "+"
and another with "*").

See https://lists.gnu.org/archive/html/bison-patches/2013-02/msg00106.html.

* src/conflicts.c (rule_has_state_sr_conflicts): Rename as...
(count_rule_state_sr_conflicts): this.
DWIM.
(count_rule_sr_conflicts): Adjust.
* tests/conflicts.at (%expect in grammar rules): New.
This commit is contained in:
Akim Demaille
2018-11-07 22:27:35 +01:00
parent 4ebebcc438
commit e51fd547ca
2 changed files with 35 additions and 12 deletions

View File

@@ -1280,6 +1280,25 @@ AT_BISON_CHECK([-o input.c input.y])
AT_CLEANUP
## -------------------------- ##
## %expect in grammar rules. ##
## -------------------------- ##
AT_SETUP([%expect in grammar rules])
AT_DATA([input.y],
[[%expect 4
%%
exp:
"number"
| exp "+" exp %expect 2
| exp "*" exp %expect 2
]])
AT_BISON_CHECK([-o input.c -rall input.y])
AT_CLEANUP
## ---------------------------------- ##
## %expect in grammar rule too much. ##
## ---------------------------------- ##