Изменение / фильтрация yytext перед вызовом yymore()
Предположим, что у меня есть следующее:
Pattern {/*Filter / process здесь затем вызовите * / yymore ();}
Что я хотел бы сделать, так это отфильтровать / обработать некоторые вещи в yytext перед вызовом yymore (). yytext никогда не будет расти в длину, только, возможно, станет короче в процессе обработки. Для этого потребуется иметь возможность сократить yytext. В качестве отправной точки я попытался посмотреть, есть ли простой способ, например, удалить последний символ yytext, но делать что-то наивно как
Yytext[yyleng-1] = ''; yyleng--;
Не сработает. yymore (), похоже, добавляет материал после символа NIL, что указывает на то, что внутри кода, сгенерированного flex, есть какой-то указатель, который указывает на текущий конец yytext. Есть ли какой-то идиоматический способ сделать это без необходимости писать более сложный набор правил?
Такие вещи, как yyless, возвращают вещи в поток ввода, который не является тем, что я хочу.
1 ответ:
Вы не можете сделать это в версии C 'flex', так как
yytext
указывает непосредственно на входной буфер. Это не копия. Если вы измените входной буфер, вы все испортите по-королевски. flex чрезвычайно тщательно обрабатывает каждый символ один и только один раз, и он не делает никакой дополнительной буферизации, кроме того, что делает источник, который вы ему предоставляете. Я считаю, что он временно помещает NUL в буфер во время выполнения действия и снова извлекает его, когда действие возвращается, для поэтому он должен иметь указатель на то, где находится ноль.Я бы перенес эту обработку в грамматику в соответствующие моменты, где вы уже должны снимать копию
yytext.