我一直试图让这段代码工作但没有成功。gdb 告诉我 void Compiler::GenerateCode_ToFile(char* filename) 函数中的某处存在段错误,我已手动将问题追溯到该行的某处:
std::string tempfile = this->code->CodeGen( temp, AST_TYPE_UNDEF, symtab, 0);
但不是在它之后或之前。此外,它似乎在运行该虚拟功能的任何代码之前崩溃。
任何人都可以在这里看到问题吗?我只是看不出是什么导致它崩溃。这是调用虚函数的函数:
void Compiler::GenerateCode_ToFile(char* filename){
char directory[MAX_PATH]; //Actually represents the full path.
strcpy( directory, this->cwd.c_str());
strcat( directory, filename);
if(this->isVerboseMode)
std::cout << "Source Output: " << directory << '\n';
std::fstream file( directory, std::ios::out);
int* temp = new int;
Symtable* symtab = new Symtable;
file << emit_core_code();
file << "\n\n";
std::string tempfile = this->code->CodeGen( temp, AST_TYPE_UNDEF, symtab, 0);
file.close();
}
这是this->code所代表的类的定义。
/// CollectionExprAST - Expression class for multiple branches.
class CollectionExprAST : public ExprAST {
std::vector<ExprAST*>* Code;
public:
CollectionExprAST(std::vector<ExprAST*>* code) : Code(code) {}
virtual std::string CodeGen(int* GeneratedCodeOpType,int WantOpType,Symtable* symtab, int depth);
int GetType(void){return AST_TYPE_COLLECTION;};
void* GetCollection(void){return this->Code;};
void DebugPrint(int level);
};
这是它的超类:
/// ExprAST - Base class for all expression nodes.
class ExprAST {
public:
virtual ~ExprAST() {}
virtual std::string CodeGen(int* GeneratedCodeOpType,int WantOpType,Symtable* symtab, int depth) {return std::string("");};
virtual void DebugPrint(int level){return;};
virtual int GetType(void){return AST_TYPE_UNDEF;};
virtual void* GetCollection(void){return NULL;};
};
最后,这是被调用的虚函数(尽管它在运行之前似乎崩溃了):
std::string CollectionExprAST::CodeGen(int* GeneratedCodeOpType,int WantOpType,Symtable* symtab, int depth)
{
Sleep(3000);
std::string ret;
int j=0;
for(;j<this->Code->size();j++){
int temp;
int i=0;
for(;i<depth;i++)
ret += "\t";
ret += (*this->Code)[j]->CodeGen(&temp,WantOpType,symtab, depth+1);
ret += '\n';
}
return ret;
}
我知道它在运行之前会崩溃,因为 Sleep() 永远不会运行。
谁能看到导致这个神秘段错误的错误?
提前致谢。