Если вы не используете yymore()
в своих действиях (и, очевидно, нет), сканеру, сгенерированному сгибанием, не требуется yyleng
для отражения длины yytext
.Вы можете изменить yyleng
любым способом или изменить значение yytext
между индексом 0 и индексом yyleng-1
, в том числе сделать его короче.
Сказав это, вы должны знать, чтосодержимое yytext
стабильно только до следующего вызова yylex
.Почти во всех приложениях, особенно если вы планируете использовать сканер из анализатора с упреждением (например, анализатор, созданный с помощью yacc / bison), вы захотите, чтобы сканер использовал копию содержимогоyytext
.В частности, сканеры, сгенерированные yacc / bison, ожидают найти семантическое значение токенов (то есть строку токена или некоторое значение, полученное из нее) в некотором члене объединения yylval
, обычно в форме указателя.
Поэтому я настоятельно рекомендую, чтобы ваша функция поместила желаемое содержимое строки в mystr
, а затем вернула его (вместо того, чтобы немедленно его освободить), и чтобы действие поместило указатель в место, где анализатор может его использовать,Это потребует лишь незначительных изменений в вашем коде и сделает сканер пригодным для использования с парсером, сгенерированным yacc / bison.