2012-09-22 64 views
2

当我在flex中运行下面的代码时,我在最后一行发现过早的EOF作为错误。如果删除了定义部分,则不会生成错误。为什么这样呢?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; 
} 

回答

6

代码的第三行出现了问题。它应该是%},而不是}%

试试这个:

%{ 
x = 0; 
%} 

%% 
[a] {x++; printf("id %d",x); } 
%% 

int main(void) 
{ 
    yylex(); 
    return 0; 
} 

我不知道你打算做什么,但一个工作的例子,将打印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; 
} 
0

你想返回true(1)从yywrap,不是0

flex manual

当扫描仪从YY_INPUT接收档案结尾的指示,它然后检查yywrap()函数。如果yywrap()返回false(零),则假定函数已经执行并且设置yyin指向另一个输入文件,并继续扫描。如果它返回true(非零),那么扫描器终止,返回0给它的调用者。