2014-12-21 24 views
1

我試圖實現flex和bison當這個循環返回了核心轉儲時的段錯誤 第一個文件工作正常但下一個文件崩潰並打印到終端分段錯誤中。flex bison和yyparse的分割錯誤

DIR *dir; 
struct dirent *ent; 

    if ((dir = opendir ("./Corpus")) != NULL) 
    { 
     while ((ent = readdir (dir)) != NULL) 
     { 
     if ((strcmp(ent->d_name,".") != 0) && (strcmp(ent->d_name,"..") != 0)) 
     { 
      printf("%s\n",ent->d_name); 
      yyin = fopen(ent->d_name,"r"); 
      yyparse(); 


     } 

     } 

     closedir (dir); 
    } 
    else 
    { 
     // could not open directory 
     perror (""); 
     return EXIT_FAILURE; 
    } 
+0

詞法分析器和解析器是有狀態的,您不能只是簡單地切換文件並開始解析該文件。相反,我建議您閱讀[FLEX手冊](http://flex.sourceforge.net/manual/),其中包含有關如何切換文件的示例。 –

+0

但我用它不是在一個循環中,它的工作。 – HatemB

+0

「但我用它不是在一個循環中,它的工作原理」。這意味着什麼。野牛和彎曲不是在考慮這種用法的情況下建立的。你需要跳過幾圈才能讓他們第二次工作。 –

回答

1

如果您使用的是比較新的版本flex,有什麼不對的,你做的方式切換輸入文件。但是,如果沒有看到更多的代碼,就不可能知道問題是什麼。

一個顯而易見的問題是,在調用fopen後,您不檢查yyin的值。如果打開失敗(很可能,請參閱下文),那麼yyin將爲NULL,並且當flex嘗試讀取時,肯定會創建段錯誤。

此外,你似乎並沒有關閉yyin,這將泄漏文件描述符。這對第二個文件應該不是問題,但最終會導致缺少文件描述符而導致打開失敗。

fopen的問題是ent->d_name只是該文件的基本名稱,沒有任何路徑。因此fopen將搜索當前工作目錄中的文件。但是,正在讀取的目錄是./Corpus,這是一個子目錄;除非文件在語料庫和主目錄之間重複,否則將不會找到該文件。

對於評論員的權益,其Flex manual狀態:

如果掃描器到達結束文件,除非任何yyin中指出在一個新的輸入文件的後續調用是未定義的(在這種情況下,掃描從那個文件繼續)…基本上,將yyin分配給新的輸入文件或使用yyrestart()來執行此操作沒有區別;後者可用於與以前版本的flex兼容,並且可用於在掃描過程中切換輸入文件。

segfault也可能與文件處理無關。最好使用調試器來確定段錯誤發生的位置。

+0

循環似乎現在運行良好。非常感謝你 – HatemB