私はファイルをスキャンし、すべてをトークンのベクトル(各トークンを格納するために作成したクラス)に保存するプログラムを持っています。その後、すべてのトークンを解析し、正しい形式(正しい文法)であるかどうかを確認します。私はイテレータを使って各トークンを投げる。しかし、なんらかの理由で、私のクラス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;
};
`
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にエラーがあるとは言いません:
示されたコードは[mcve]の要件を満たしていません。質問を編集し、[mcve]を含める必要があります。 –
'DatalogProgram.h'のコードも投稿できますか? –
ええ、私はDatalogProgram.hを追加しました。 –