2013-04-05 76 views
3

我有以下文件:野牛和沒有指定類型的錯誤

CP.h

#ifndef CP_H_ 
#define CP_H_ 

class CP { 
public: 
     enum Cardinalite {VIDE = '\0', PTINT = '?', AST = '*', PLUS = '+'}; 

     CP(Cardinalite myCard); 
     virtual ~CP(); 
private: 
     Cardinalite card; 
}; 

#endif /* CP_H_ */ 

而且dtd.y

%{ 

using namespace std; 
#include <cstring> 
#include <cstdio> 
#include <cstdlib> 
#include "AnalyseurDTD/DtdDocument.h" 
#include "AnalyseurDTD/CP.h" 

void yyerror(char *msg); 
int yywrap(void); 
int yylex(void); 

DtdDocument * doc = new DtdDocument(); 
%} 

%union { 
     char *s; 
     DtdElement * dtdelt; 
     CP *cpt; 
     CP::Cardinalite card; 
} 

而下面奇怪的錯誤:

AnalyseurDTD/dtd.y:20:2: error: ‘CP’ does not name a type 
AnalyseurDTD/dtd.y:21:2: error: ‘CP’ does not name a type 

問題是,如果我把CP * cpt;在DtdDocument之後* doc = new DtdDocument();我沒有錯誤:/

回答

2

包括在掃描儀的文件頭,你包括*.tab.h

// scanner.l file 

%{ 
#include "myheader.h" 
#include "yacc.tab.h" 

// other C/C++ code 

%} 

// helper definitions 

%% 

// scanner rules 

%% 

%unionyacc.tab.h定義,所以當你編譯你需要確保編譯器看到你的新類型定義,它處理yacc.tab.h

前前
2

您確定錯誤來自Bison嗎?我敢冒險它來自你的編譯器。並且可能在試圖編譯掃描儀時。我建議你的YYSTYPE在你生成的頭文件中沒有正確定義。嘗試

%code requires { #include "AnalyseurDTD/CP.h" } 

這樣dtd.h是自包含的。請參閱有關%code的文檔。

並請,總是提供足夠完整的日誌,以便我們可以嘗試瞭解您的問題。在這裏,你甚至不顯示你運行的工具,我幾乎不認爲它是Bison。

+0

謝謝,但我失敗了,它似乎沒有找到我的CP.h:'AnalyseurDTD/dtd.y:17:29:致命錯誤:AnalyseurDTD/CP.h:沒有這樣的文件或目錄' – GlinesMome 2013-04-05 08:18:12

+0

那麼,修復你的路徑。將適當的-I傳遞給你的編譯器。如果你想得到實際的幫助,而不是占卜,再次發佈完整的日誌。 – akim 2013-04-08 09:24:52

2

最近我在使用flex和野牛。有幾個建議可能有助於您找到問題:

  1. 編譯文件一個接一個,以確保在代碼中沒有明顯的編譯錯誤。
  2. 檢查由bison生成的頭文件(類似*.tab.h)。找到YYSTYPE的定義。很有可能它不包含頭文件AnalyseurDTD/CP.h
  3. 如果是這種情況,在加入*.tab.h之前應始終包含AnalyseurDTD/CP.h。在需要的地方添加它以確保在YYSTYPE之前定義了類別CP
  4. 如果仍然無法找到問題,請嘗試在聯合中使用void *cpt;,然後在其餘代碼中添加類型轉換。