Проблема с GNU Bison

У меня проблема с бизоном 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;

тогда первой операцией должна быть экспоненциальная операция, а затем умножение. Вместо этого он работает в том порядке, в котором указан.

я пробовал изменять приоритеты, но результат в точности тот же.


Ответы (1 шт):

Автор решения: xeneww_

я решил проблему. оказалось, токен сначала определяют, а потом уже задают приоритеты)

→ Ссылка