以下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;
}
它捕获yytext
中firstChar
的初始值,并在调用yylex
后打印出前两个字节的数值。编译并运行扫描程序:
$ flex example.l
$ gcc -o example lex.yy.c
$ echo -n "foobar" | ./example
0 0
答案 0 :(得分:2)
yytext
未指向&#39; stdin
缓冲区&#39;。它指向内部的私人缓冲区&#39; flex&#39;。什么都不能保证什么&#39; flex&#39;做或不做自己的缓冲。这是它的业务。如果你想保存数据,你应该从中复制数据。
答案 1 :(得分:1)
lex / flex总是做一些预测。请记住,yytext
只是匹配字符串的名称 - 包括文件结束规则。
如果要在给定规则中捕获yytext
的第一个出现,并使其保持不变,则应该制定规则的那一部分,例如,
.* if (firstChar == 0) firstChar = strdup(yytext);