Если вы собираетесь использовать #define
для переопределения YYSTYPE
, то вам нужно сделать это до вас #include <y.tab.h>
.В противном случае y.tab.h
сделает YYSTYPE
псевдонимом типа (typedef
) для int
.Поскольку и y.tab.h
, и y.tab.c
также объявляют yylval
(как extern YYSTYPE
), вам фактически нет необходимости объявлять его где-либо, но вам все равно нужно поставить #define
перед #include
.
Если вы собираетесь использовать бизона, есть гораздо более удобные способы для повторной декларации YYSTYPE
.Лучше всего поместить
%define api.value.type { char* }
в ваш файл .y
, например, непосредственно перед объявлением %token
.Затем вы можете удалить #define YYSTYPE
из обоих файлов, а также объявления extern YYSTYPE yylval;
, поскольку bison поместит соответствующий typedef
в заголовочный файл.
Вы действительно должны скомпилировать свой проект с помощью
gcc -Wall lex.yy.c y.tab.c
Тогда gcc предупредит вас о многих ошибках.И bison, и flex будут генерировать код без предупреждений, при условии, что вы добавили в файл lex следующее:
%option noinput nounput
Я обычно также рекомендую использовать %option noyywrap
, так как это позволит вам избежать необходимости писатьфиктивная yywrap
реализация.