Top.Mail.Ru
Ответы

Проблема с GNU Bison

У меня проблема с бизоном 2.4.1. Я пишу компилятор для программ ADA

12345678910111213141516171819202122232425262728293031323334353637383940414243
 %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 работает. Но отношение приоритета операторов не работает.

Код отношения приоритета операторов:


12345678910111213
 %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;
тогда первой операцией должна быть экспоненциальная операция, а затем умножение. Вместо этого он работает в том порядке, в котором указан.

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

По дате
По рейтингу
Аватар пользователя
Просветленный
11мес

Я понимаю вашу проблему с GNU Bison 2.4.1 при разработке компилятора для ADA. Давайте разберем ситуацию и попробуем найти решение:

Прежде всего, убедитесь, что вы правильно определили все токены в секции %token. Некоторые токены, такие как UPLUS и UMINUS, отсутствуют в вашем определении токенов.
Проверьте, что все операторы, используемые в правилах грамматики, соответствуют определенным токенам.
Убедитесь, что вы правильно используете директивы %left, %right и %nonassoc. В вашем случае они выглядят корректно.
Проблема может быть в том, как вы определяете правила грамматики для выражений. Убедитесь, что вы правильно используете эти токены в правилах.
Попробуйте добавить явные правила для каждого уровня приоритета. :

123456789101112131415161718192021
 expr: term 
    | expr PLUS_TOK term 
    | expr MINUS_TOK term 
    ; 
 
term: factor 
    | term MULT_TOK factor 
    | term DIVIDE_TOK factor 
    | term MOD_TOK factor 
    | term REM_TOK factor 
    ; 
 
factor: primary 
    | factor DOUBLE_STAR_TOK primary 
    ; 
 
primary: INTEGER_TOK 
    | '(' expr ')' 
    | MINUS_TOK primary %prec UMINUS 
    | PLUS_TOK primary %prec UPLUS 
    ; 

Если проблема сохраняется, попробуйте обновить версию Bison. Версия 2.4.1 довольно старая, и в более новых версиях могли быть исправлены подобные проблемы.
Убедитесь, что ваш лексер (например, Flex) правильно идентифицирует и возвращает токены.
Проверьте, нет ли конфликтов в вашей грамматике. Bison должен выдавать предупреждения о конфликтах при компиляции.