Witam. Próbuję napisać prosty kompilator z wykorzystaniem FLEXA i BISONA. Niestety podczas pisania DO WHILE oraz WHILE natrafiam na konflikt redukcja/redukcja
Gramatyka ma wygladać tak

WHILE condition DO commands ENDWHILE
|DO commands WHILE condition ENDDO

a wiec piszę

| DO {
       ...
    } commands WHILE condition { ...} ENDDO
|   WHILE {
      ...
    } condition {
        ...
    } DO commands ENDWHILE {
      ...
    }

Niestety podczas kompilaci otrzymuję warning: 2 reduce/reduce conflicts

Ma ktoś pomysły jak to naprawić? Prosze o pomoc.
Może coś tu zmienić?

%token <str> NUM
%token <str> VAR BEG END IF THEN ELSE ENDIF
%token <str> DO WHILE  ENDWHILE FOR FROM ENDFOR ENDDO
%token <str> WRITE READ IDE SEM TO DOWNTO
%token <str> LB RB ASG EQ LT GT LE GE NE ADD SUB MUL DIV MOD COLON

%type <str> value
%type <str> identifier

albo tu?

"["             { BEGIN(CMT);       }
<CMT>"]"        { BEGIN(INITIAL);   }
<CMT>(\n|.)
<CMT><<EOF>>    { printf("Błąd: niezakończony komentarz.\n"); yyterminate(); }

"DECLARE"           { return VAR;      }
"IN"         { return BEG;      }
"END"           { return END;      }

":="            { return ASG;      }
"IF"            { return IF;       }
"THEN"          { return THEN;     }
"ELSE"          { return ELSE;     }
"WHILE"         { return WHILE;    }
"FOR"           { return FOR;      }
"FROM"          { return FROM;     }
"TO"            { return TO;       }
"DOWNTO"        { return DOWNTO;   }
"ENDIF"         { return ENDIF;    }
"ENDWHILE"      { return ENDWHILE; }
"ENDFOR"        { return ENDFOR;   }
"ENDDO"        { return ENDDO;   }
"DO"            { return DO;       }

"WRITE"         { return WRITE;    }
"READ"          { return READ;     }

"=="             { return EQ;       }
"<"             { return LT;       }
">"             { return GT;       }
"<="            { return LE;       }
">="            { return GE;       }
"!="            { return NE;       }

"+"             { return ADD;      }
"-"             { return SUB;      }
"*"             { return MUL;      }
"/"             { return DIV;      }
"%"             { return MOD;      }
"("             { return LB;       }
")"             { return RB;       }
":"             { return COLON;       }

[0-9]+          { yylval.str = (char *)strdup(yytext);
                    return NUM;    }
[_a-z]+         { yylval.str = (char *)strdup(yytext);
                    return IDE;    }

";"             { return SEM;      }
[ \t\r\n]+
.

%%