Проблема в том, что вы возвращаете указатели на yytext
для ваших семантических значений маркера. yytext
является внутренним буфером flex, используемым для соответствия токенам, и его значение действует только до следующего вызова yylex
для чтения следующего токена. Таким образом, ваши семантические значения ($1
и т. Д.) В конечном итоге становятся висящими указателями в буфер, который перезаписывается с большим количеством токенов данных из более поздних токенов.
Вам нужно скопировать строку из yytext
в некоторый которые будут доступны дольше. strdup
очень полезен для этого:
\[[A-Za-z_]*\] {yylval.val_char=strdup(yytext); return SECTION_NAME;}
[A-Z_a-z[:digit:]]*[A-Z_a-z][A-Z_a-z[:digit:]]* {yylval.val_char=stdrup(yytext); return OPTION_NAME;}
и т. д.