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]+
.
%%