Если вы явно не объявите тип семантического значения, bison / yacc предполагает, что семантические значения имеют тип int
.Объявление yylval
в вашем flex-файле ничего не меняет, так как bison никогда не видит этот файл.(Однако это приводит к неопределенному поведению, поскольку yylval
заканчивается объявлением двух разных типов. Я бы ожидал, что компилятор пожалуется на это.)
Вы можете объявить тип семантического значения в вашем бизоне.файл, подобный следующему:
%define api.value.type {double}
(я использовал double
, потому что это почти наверняка то, что вы хотите; float
- это тип данных с низкой точностью, который следует использовать только при наличии уважительной причины.)
Вы также должны удалить объявление yylval
из вашего гибкого файла, так как оно будет объявлено в заголовочном файле, созданном bison.
См. Руководство bison для более подробной информации и примеров кода.