Usar a precedência em Bison para menos unário não resolve o conflito de mudança / redução
Eu estou planejando uma gramática muito simples, onde eu uso o operando menos unário. No entanto, recebo um conflito de mudança / redução. No manual do Bison, e em qualquer outro lugar que eu veja, ele diz que eu deveria definir um novo token e dar a ele uma precedência maior do que o binário menos operando, e então usar "% prec TOKEN" na regra.
Eu fiz isso, mas ainda recebo o aviso. Por quê?
Estou usando o bison (GNU Bison) 2.4.1. A gramática é mostrada abaixo:
%{
#include <string>
extern "C" int yylex(void);
%}
%union {
std::string token;
}
%token <token> T_IDENTIFIER T_NUMBER
%token T_EQUAL T_LPAREN T_RPAREN
%right T_EQUAL
%left T_PLUS T_MINUS
%left T_MUL T_DIV
%left UNARY
%start program
%%
program : statements expr
;
statements : '\n'
| statements line
;
line : assignment
| expr
;
assignment : T_IDENTIFIER T_EQUAL expr
;
expr : T_NUMBER
| T_IDENTIFIER
| expr T_PLUS expr
| expr T_MINUS expr
| expr T_MUL expr
| expr T_DIV expr
| T_MINUS expr %prec UNARY
| T_LPAREN expr T_RPAREN
;