Обычно yylval объявляется и определяется в файле y.tab.c, выводимом bison. Он также объявлен (как extern) в файле y.tab.h, поэтому, если вы включите его в свой лексер, вы можете получить доступ к yylval как к глобальной переменной. Это нормальный способ работы flex / bison, и нет необходимости редактировать файлы, чтобы вынуть вещи - он должен просто работать
Это использование глобальной переменной вызывает проблемы, если вы хотите иметь более одного парсера в программе или хотите использовать несколько парсеров в разных потоках (или иным образом одновременно). Bison предоставляет способ избежать этого с помощью %define api.pure
, который избавляет от yylval как глобального - вместо этого парсер будет вызывать yylex с адресом YYSTYPE (указатель), и лексер должен поместить туда значение токена, а не в yylval. Если вы используете flex, вам нужно, чтобы #define YY_DECL int yylex(YYSTYPE *val)
в верхней части вашего файла flex изменило объявление, используемое для yylex.