flex 词法分析器覆盖标准输入缓冲区的前两个字节

flex lexer overwriting first two bytes of stdin buffer

以下 flex 源文件生成一个扫描器,一旦完成标记化,它似乎会用空字节覆盖 stdin 缓冲区的前两个字节。这是预期的行为吗?

%{
const char *firstChar;
%}

%%

.* firstChar = yytext;
<<EOF>> return 0;

%%

int main(void){
    yylex();
    printf("%d %d\n", firstChar[0], firstChar[1]);
    yylex_destroy();
    return 0;
}

它在firstChar中捕获yytext的初始值,并在调用yylex后打印出其前两个字节的数值。编译和 运行 扫描器:

$ flex example.l
$ gcc -o example lex.yy.c
$ echo -n "foobar" | ./example
0 0

lex/flex 总是向前看。请记住,yytext 只是为匹配字符串指定的名称——其中包括文件结束规则。

如果您想捕获给定规则中 yytext 第一次 出现,并让它持续存在,您应该将那部分作为规则,例如,

.* if (firstChar == 0) firstChar = strdup(yytext);

yytext 没有指向“stdin 缓冲区”。它指向 'flex' 内的私有缓冲区。 'flex' 对它自己的缓冲区做什么或不做什么,在任何地方都无法保证。那是它的事。如果你想保存它,你应该从它复制数据。