Wie löse ich einen bison reduce/reduce Konflikt?

In einer anderen Frage dachte ich mir, dass es schöner wäre (alle anderen nicht...😋), wenn das Vorzeichen zur Zahl gehören würde, so dass das Potenzieren nicht das Vorzeichen abbindet... Da wollte ich mal sehen, ob man nicht einen Parser bauen kann, der es wie folgt versteht:Das läuft auch ganz gut, allerdings gibt es massenhaft sogenannte reduce/reduce Konflikte... Die bison Anleitung sagt zwar, dass diese Konflikte in meinem Sinne gelöst werden (die Regel, die zuerst kommt, die kriegt den Zuschlag), aber: Wie krieg ich die warning trotzdem weg?

Das da ist mein yy-file (auszugsweise):

exp:
   "-" "num"            { std::cout << "NUMinv" << $2 << std::endl; }
|  "num"                { $$ = new Float($1); std::cout << "num" << $1 << std::endl; }
|  "-" exp              { std::cout << "inv" << $2 << std::endl; }
|  exp "^" exp          { std::cout << '^' << std::endl; }
|  "name"               { std::cout << "var read:" << $1 << std::endl; };

bison sagt dann:

> bison -o viz-yy.c viz.yy -Wcounterexamples
viz.yy: warning: 10 reduce/reduce conflicts [-Wconflicts-rr]
viz.yy: warning: reduce/reduce conflict on tokens "+", "-", "*", "/", "^", ")", "]", "}", ",", ";" [-Wcounterexamples]
  Example: "-" "num" •
  First reduce derivation
    exp
    ↳ 5: "-" "num" •
  Second reduce derivation
    exp
    ↳ 8: "-" exp
             ↳ 6: "num" •
Cplusplus, FLEX, Programmiersprache, Syntax, Bison

Meistgelesene Beiträge zum Thema Syntax