我正在设计一个非常简单的语法,我使用一元减操作数。但是,我遇到了转变/减少冲突。在 Bison 手册以及我查看的其他任何地方,它都说我应该定义一个新标记并赋予它比二进制减操作数更高的优先级,然后在规则中使用“%prec TOKEN”。
我已经这样做了,但我仍然收到警告。为什么?
我正在使用野牛(GNU Bison)2.4.1。语法如下所示:
%{
#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
;