Используйте 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 также отображаются в нем, так что вы можете вносить изменения в любое время в зубре, и вам не нужно беспокоиться о внесении таких же изменений в гибкий файл.