c-flex lexer覆盖stdin缓冲区的前两个字节



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

%{
const char *firstChar;
%}
%%
.* firstChar = yytext;
<<EOF>> return 0;
%%
int main(void){
    yylex();
    printf("%d %dn", 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

yytext不指向"stdin缓冲区"。它指向"flex"内部的一个专用缓冲区。任何地方都不能保证"flex"对自己的缓冲区做了什么或不做什么。这是它的事。如果你想保存它,你应该从中复制数据。

lex/flex总是做一些前瞻性的工作。请记住,yytext只是匹配字符串的名称,其中包括文件结尾规则。

如果您想捕获给定规则中yytext第一次出现,并使其持久化,则应将该部分作为规则的一部分,例如

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

最新更新