Если вы хотите придерживаться стандартного (POSIX) lex / yacc, тогда ваш единственный вариант - использовать глобальные переменные / функции. Если вы хорошо используете расширения Bison и Flex, есть несколько способов передачи переменных, которые в основном включают добавление дополнительных параметров в yyparse () и yylex ().
В Bison это достигается с помощью% lex-param и% parse-param.
%parse-param { struct somestruct *mystruct }
%lex-param { struct somestruct *mystruct }
Во Flex есть два разных механизма, в зависимости от того, хотите ли вы входящий лексер или нет. Предполагая, что вы выберете опцию по умолчанию (без повторного входа), вам нужно переопределить YY_DECL:
%{
#define YY_DECL int yylex(struct somestruct *mystruct)
%}
В реентерабельном лексере Flex можно добавить дополнительные аргументы через структуру сканера, которую Flex переносит для сохранения своего состояния. Вы хотите определить YY_EXTRA_TYPE; к дополнительным данным можно получить доступ через yyget / set_extra ().