Используйте typedef в union

Я хочу переопределить float, используя:

typedef float decimal

потому что я использую таблицу "uthash" и у нее нет метода add_float, это может сделать только я через структуру

я использовал это в бизоне

%union{
   decimal dec;
}
and then declare the token
%token <dec> DECIMAL

если я делаю в гибкой

{DECIMAL} {yylval.dec=atof(yytext); return (DECIMAL);}

он говорит мне: ОШИБКИ в документе flex: YYSTYPE не имеет члена с именем dec

ОШИБКИ в бизоне (в объединении) ожидали спецификатор-спецификатор-список перед десятичной.

Есть идеи? Любая помощь приветствуется!

1 ответ

Кажется, у вас есть несколько проблем.

Во-первых, ваше гибкое правило {DECIMAL} {yylval.dec=atof(yytext); return (DECIMAL);} не имеет смысла. Является DECIMAL макрос или замена для некоторого соответствующего шаблона регулярных выражений? Это не так, потому что DECIMAL объявлен как ЗНАК в зубре.

В любом случае, простая проблема в вашем союзе для yylval в Bison - это тип decimal нигде не было объявлено. У тебя должно быть typedef decimal float объявлено где-то в вашем файле зубров и в вашем гибком файле. Это то, что сообщение об ошибке

ERRORS in the bison (in the union) expected specifier-qualifier-list before decimal.

имеет в виду более 99% времени.

Теперь, чтобы решить эту проблему, вам нужно будет либо поместить его в отдельный файл и включить этот файл в файлы flex и bison. Это грязно, и более простой подход заключается в том, чтобы просто поместить его в первый раздел файла Bison (первая часть, где идет код C). Тогда, если вы используете

bison -d myfile.y

вы получите новый файл с именем myfile.tab.h (вместе с myfile.tab.c). Заголовок должен быть включен в гибкий файл. Если вы загляните в этот заголовочный файл, то увидите, что все его определения% token также отображаются в нем, так что вы можете вносить изменения в любое время в зубре, и вам не нужно беспокоиться о внесении таких же изменений в гибкий файл.

Другие вопросы по тегам