当我在 flex 中运行以下代码时,我在最后一行得到过早的 EOF 作为错误。如果定义部分被删除,则不会产生错误。为什么会这样?
%{
#include <stdio.h>
int x = 0;
}%
%%
"a" {x=x+1; printf("id %d",x); }
%%
int yywrap(void)
{
return 0;
}
int main(void)
{
int x = 0;
yylex();
return 0;
}
当我在 flex 中运行以下代码时,我在最后一行得到过早的 EOF 作为错误。如果定义部分被删除,则不会产生错误。为什么会这样?
%{
#include <stdio.h>
int x = 0;
}%
%%
"a" {x=x+1; printf("id %d",x); }
%%
int yywrap(void)
{
return 0;
}
int main(void)
{
int x = 0;
yylex();
return 0;
}
您的代码的第三行有问题。它应该是 %} 而不是 }%
尝试这个 :
%{
x = 0;
%}
%%
[a] {x++; printf("id %d",x); }
%%
int main(void)
{
yylex();
return 0;
}
我不知道您打算做什么,但是一个工作示例将为输入文件中遇到的每个a打印一个id看起来像这样:
%{
x = 0;
%}
%%
[a] {x++; printf("id %d ",x); }
%%
int main(int argc,char * argv[])
{
yyin = fopen(argv[1],"r");
yylex();
fclose(yyin);
return 0;
}
您想从 yywrap 返回 true (1),而不是 0。
从弹性手册:
当扫描仪收到来自 的文件结束指示时
YY_INPUT
,它会检查该yywrap()
功能。如果yywrap()
返回 false(零),则假定该函数已继续执行并设置yyin
为指向另一个输入文件,并继续扫描。如果它返回真(非零),则扫描器终止,向其调用者返回 0。