以下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);