当我在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;
}
答案 0 :(得分:6)
代码的第三行有问题。它应该是%}而不是}%
试试这个:
%{
x = 0;
%}
%%
[a] {x++; printf("id %d",x); }
%%
int main(void)
{
yylex();
return 0;
}
我不知道您打算做什么,但是为输入文件中遇到的每个 a 打印 id 的工作示例将有点像这样:< / p>
%{
x = 0;
%}
%%
[a] {x++; printf("id %d ",x); }
%%
int main(int argc,char * argv[])
{
yyin = fopen(argv[1],"r");
yylex();
fclose(yyin);
return 0;
}
答案 1 :(得分:0)
你想从yywrap返回true(1),而不是0。
来自flex manual:
当扫描程序收到
YY_INPUT
的文件结束指示时,它会检查yywrap()
功能。如果yywrap()
返回false(零),则假定该函数已经完成并设置yyin
以指向另一个输入文件,并继续扫描。如果它返回true(非零),则扫描程序终止,向其调用者返回0。