Изменение / фильтрация yytext перед вызовом yymore()


Предположим, что у меня есть следующее:

Pattern {/*Filter / process здесь затем вызовите * / yymore ();}

Что я хотел бы сделать, так это отфильтровать / обработать некоторые вещи в yytext перед вызовом yymore (). yytext никогда не будет расти в длину, только, возможно, станет короче в процессе обработки. Для этого потребуется иметь возможность сократить yytext. В качестве отправной точки я попытался посмотреть, есть ли простой способ, например, удалить последний символ yytext, но делать что-то наивно как

Yytext[yyleng-1] = ''; yyleng--;

Не сработает. yymore (), похоже, добавляет материал после символа NIL, что указывает на то, что внутри кода, сгенерированного flex, есть какой-то указатель, который указывает на текущий конец yytext. Есть ли какой-то идиоматический способ сделать это без необходимости писать более сложный набор правил?

Такие вещи, как yyless, возвращают вещи в поток ввода, который не является тем, что я хочу.

1 3

1 ответ:

Вы не можете сделать это в версии C 'flex', так как yytext указывает непосредственно на входной буфер. Это не копия. Если вы измените входной буфер, вы все испортите по-королевски. flex чрезвычайно тщательно обрабатывает каждый символ один и только один раз, и он не делает никакой дополнительной буферизации, кроме того, что делает источник, который вы ему предоставляете. Я считаю, что он временно помещает NUL в буфер во время выполнения действия и снова извлекает его, когда действие возвращается, для поэтому он должен иметь указатель на то, где находится ноль.

Я бы перенес эту обработку в грамматику в соответствующие моменты, где вы уже должны снимать копию yytext.