Я написал следующую грамматику:
%union{
string *s;
float num;
}
%token div_token mod_token sqrt_token it_token abs_token
%token <num> num_token
%token <s> Stampa
%type <num> E
%left '+' '-'
%left '*' '/' div_token mod_token
%left UMINUS
%left abs_token sqrt_token
%%
Program: Program Line '\n' { }
| Line '\n' { }
;
Line: Stampa {cout<<*$1<<endl;}
| E {cout<<$1<<endl; broj = $1;}
| it_token {cout<<broj<<endl;}
;
E: E '+' E {$$ = $1 + $3;}
| E '-' E {$$ = $1 - $3;}
| E '*' E {$$ = $1 * $3;}
| E '/' E {if($3!=0)
$$ = $1 / $3;
else
yyerror("Deljenje nulom");
}
| mod_token E E {$$ = (float)((int)$2 % (int)$3);}
| div_token E E {$$ = (float)((int)($2 / $3));}
| sqrt_token E { $$ = sqrt($2); }
| '(' E ')' {$$=$2;}
| abs_token E { $$ = abs($2);}
| '-' E %prec UMINUS {$$=-$2;}
| num_token {$$ = $1;}
;
Теперь bison обнаружил 8 конфликтов уменьшения/уменьшения. Когда я удаляю строку
| '-' E %prec UMINUS {$$=-$2;}
их нет. Я думаю, что приоритеты и ассоциативные свойства хорошо определены. Может кто подскажет как разрешать конфликты?