Кажется, у вас есть несколько проблем.
Во-первых, ваше гибкое правило {DECIMAL} {yylval.dec=atof(yytext); return (DECIMAL);}
не имеет смысла. Является ли DECIMAL
макросом или заменой некоторого подходящего шаблона регулярного выражения? Это не так, потому что DECIMAL
объявлен как ЗНАК в зубре.
В любом случае, простая проблема в вашем союзе для yylval в Bison - это тип decimal
, который нигде не был объявлен. Вы должны объявить typedef decimal float
где-нибудь в вашем файле зубров и в файле flex. Это то, что сообщение об ошибке
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). Заголовок должен быть включен в гибкий файл. Если вы загляните в этот заголовочный файл, то увидите, что все его определения% токенов также отображаются в нем, так что вы можете вносить изменения в любое время в зубре, и вам не нужно беспокоиться о внесении таких же изменений в гибкий файл. *