2012-09-22 69 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給它的調用者。