我对野牛 2.4.1 有问题。我正在为 ADA 程序编写编译器
%token INTEGER_TOK 347
%left AND_TOK OR_TOK XOR_TOK
%left EQUAL_TOK NOT_EQUAL_TOK LESS_TOK GREATER_TOK LESS_EQUAL_TOK GREATER_EQUAL_TOK
%left PLUS_TOK MINUS_TOK
%left MULT_TOK DIVIDE_TOK MOD_TOK R EM_TOK
%left DOUBLE_STAR_TOK ABS_TOK
%right NOT_TOK
%left UPLUS UMINUS
}%
unary_operator :
PLUS_TOK %prec UPLUS
{
if(trace) printf("Unary_operator 1\n");
$$.st_ptr=mknode1("adding_operator",NULL,mknode1("PLUS_TOK",NULL,NULL,NULL,NULL),NULL,NULL);
}
|MINUS_TOK %prec UMINUS
{
if(trace) printf("Unary_operator 2\ n");
$$.st_ptr=mknode1("adding_operator",NULL,mknode1("MINUS_TOK",NULL,NULL,NULL,NULL),NULL,NULL);
};
它在这里工作%token
。但运算符优先级关系不起作用。
运算符优先级关系代码:
%left AND_TOK OR_TOK XOR_TOK
%left EQUAL_TOK NOT_EQUAL_TOK LESS_TOK GREATER_TOK LESS_EQUAL_TOK GREATER_EQUAL_TOK
%left PLUS_TOK MINUS_TOK
%left MULT_TOK DIVIDE_TOK MOD_TOK REM_TOK
%left DOUBLE_STAR_TOK ABS_ TOK
%right NOT_TOK
%left UPLUS UMINUS
不起作用。
我相信这是野牛的问题。
例如,
如果你进行操作
a:=2*3**2/9 mod 2+b*2 rem 2;
那么第一个运算应该是指数运算,然后是乘法。相反,它按照指定的顺序工作。
我尝试改变优先级,但结果完全一样。