Я понимаю вашу проблему с GNU Bison 2.4.1 при разработке компилятора для ADA. Давайте разберем ситуацию и попробуем найти решение:
Прежде всего, убедитесь, что вы правильно определили все токены в секции %token. Некоторые токены, такие как UPLUS и UMINUS, отсутствуют в вашем определении токенов.
Проверьте, что все операторы, используемые в правилах грамматики, соответствуют определенным токенам.
Убедитесь, что вы правильно используете директивы %left, %right и %nonassoc. В вашем случае они выглядят корректно.
Проблема может быть в том, как вы определяете правила грамматики для выражений. Убедитесь, что вы правильно используете эти токены в правилах.
Попробуйте добавить явные правила для каждого уровня приоритета. :
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 должен выдавать предупреждения о конфликтах при компиляции.
Здесь %token работает. Но отношение приоритета операторов не работает.
Код отношения приоритета операторов:
не работает.
я считаю, что это проблема с бизонами.
Например,
если дать операцию
a:=2*3**2/9 mod 2+b*2 rem 2;
тогда первой операцией должна быть экспоненциальная операция, а затем умножение. Вместо этого он работает в том порядке, в котором указан.
я пробовал изменять приоритеты, но результат в точности тот же.