2017-05-24 9 views
-3

私はファイルをスキャンし、すべてをトークンのベクトル(各トークンを格納するために作成したクラス)に保存するプログラムを持っています。その後、すべてのトークンを解析し、正しい形式(正しい文法)であるかどうかを確認します。私はイテレータを使って各トークンを投げる。しかし、なんらかの理由で、私のクラスParserはイテレータを宣言する方法が好きではありません。これは私の主な機能です:クラスのプライベートメンバーとして宣言されたイテレータが正しく動作していません

#pragma once 

#include "DatalogProgram.h" 
#include "Predicate.h" 
#include "Rule.h" 
#include "Token.h" 
#include <set> 
#include <vector> 

using namespace std; 
class Parser : public Token { 

public: 
    Parser() { it = tokens.begin(); } 
    Parser(vector<Token*> tokens, DatalogProgram *DLP) { this->tokens = tokens; this->DLP = DLP; it = tokens.begin(); } 
    ~Parser() { } 

    bool checkDatalog(); 
    void checkScheme(); 
    void checkSchemeList(); 
    void checkIdList(Predicate* scheme); 
    void checkFact(); 
    void checkFactList(); 
    void checkQuery(); 
    void checkQueryList(); 
    void checkStringList(Predicate* pred); 
    void checkRule(); 
    void checkRuleList(); 
    void checkHeadPredicate(Rule* rule); 
    Predicate* checkPredicate(); 
    void checkPredicateList(Rule* rule); 
    string checkParameter(); 
    void checkParameterList(Predicate* pred); 
    string checkExpression(); 
    string checkOperator(); 

    bool match(TokenType second, Token *token); 
    void domainPrinter(); 
private: 
    vector<Token*> tokens; 
    DatalogProgram *DLP; 
    vector<Token*>::iterator it; 
    set<string> domain; 
    stringstream expression; 


}; 

DatalogProgram.h:

`#pragma once 

#include "Scanner.h" 
#include "Rule.h" 
#include "Predicate.h" 
#include "Parser.h" 

//using namespace std; 
class DatalogProgram : public Token { 

public: 
    DatalogProgram() { } 
    ~DatalogProgram() { } 
    inline void addScheme(Predicate scheme) { schemes.push_back(scheme); } 
    inline void addRule(Rule rule) { rules.push_back(rule); } 
    inline void addFact(Predicate fact) { facts.push_back(fact); } 
    inline void addQuery(Predicate query) { queries.push_back(query); } 

    void printScheme(); 
    void printFact(); 
    void printRule(); 
    void printQuery(); 
    void printPredicate(vector <Predicate> printing); 

    vector<Predicate> schemes; 
    vector<Rule> rules; 
    vector<Predicate> facts; 
    vector<Predicate> queries; 
}; 
` 

そして、これは私のエラーです:enter image description here

int main(){ 
    DatalogProgram DLP; 
    bool passed = true; 
     ifstream in; 
     Scanner scanner; 
     in.open("File7.txt"); 
//  in.open(argv[1]); 
     Parser parse(scanner.getTokens(), &DLP); 
     scanner.scan(in); 
     try { 
      parse.checkDatalog(); 
     } 
     catch (Token* token) { 
      cout << "Failure!\n "; 
      cout << "(" << token->getType(token->type) << ",\"" << token->value << "\"," << token->lineNumber << ")"; 
      passed = false; 
     } 
     if (passed) 
     { 
      cout << "Success!\n"; 
      DLP.printScheme(); 
      DLP.printFact(); 
      DLP.printRule(); 
      DLP.printQuery(); 
     } 
     system("pause"); 
    return 0; 
} 

これは私が私のイテレータを宣言し、私の​​パーサヘッダファイルであります 私がコンパイルしようとする前に、visual studioは私のparser.hにエラーがあるとは言いません: enter image description here

+1

示されたコードは[mcve]の要件を満たしていません。質問を編集し、[mcve]を含める必要があります。 –

+1

'DatalogProgram.h'のコードも投稿できますか? –

+0

ええ、私はDatalogProgram.hを追加しました。 –

答えて

0

再帰的なヘッダー依存関係があります。これはC++では動作しません。フォワードParser.h内DatalogProgramを宣言して示したヘッダファイルが完全に壊れているDatalogProgram.h

#include "DatalogProgram.h" <-- Delete this line. 
struct DatalogProgram; 

class Parser : public Token { 
    .... 
1

にParser.hの依存関係を削除します。

main翻訳単位には、おそらくDatalogProgram.hヘッダーが含まれています。

DatalogProgram.hすぐParser.hが含まれています

#pragma once 

/* ... */ 

#include "Parser.h" 

そしてParser.h再度Datalog.hを含めるように進ん:

#pragma once 

#include "DatalogProgram.h" 

をしかしDatalogProgram.hはすでに#pragma onceは完全にこれを無視し、含まれているため。コンパイルはそれまでに進行:

Parser(vector<Token*> tokens, DatalogProgram *DLP) 

しかしDatalogProgramがまだ定義されていないため、このクラスが定義されていません。これにより、コンパイルエラーが発生します。

inter-headerファイルの依存関係を把握し、循環依存関係を修正する必要があります。ほとんどの場合、前方宣言を使用します。

関連する問題