#include "deptree.h" int DepTree::CreateNodeFromVar(const std::string& var, UsedType& used, CallStack& callstack) { COUT(DEBUG)<<"DepTree::CreateNodeFromVar "<UsedIdents(ids); type=DepTree::VAR; name=var; DepTree* d; int ret; callstack.insert(this); for(auto& i:ids) { d=FindNodeByVar(i); if(d==0) { auto n=*childrens.insert(new DepTree).first; n->parents.insert(this); ret=n->CreateNodeFromVar(i,used,callstack); if(ret!=0) { COUT(ERROR)<<" in definition of variable "<parents.insert(this); } } callstack.erase(this); return 0; } int DepTree::CreateNodeFromSP(DepTree::NodeType list, G_toType::size_type ind, UsedType& used) { if(list!=DepTree::SAVE && list!=DepTree::PRINT) { COUT(ERROR)<<"Internal error, incorrect NodeType in DepTree::CreateNodeFromSP()."<Dump()< ids; CallStack callstack; type=list; index=ind; if(type==DepTree::SAVE) G_tosave[index]->UsedIdents(ids); else if(type==DepTree::PRINT) G_toprint[index]->UsedIdents(ids); DepTree* d; int ret; for(auto& i:ids) { d=FindNodeByVar(i); if(d==0) { auto n=*childrens.insert(new DepTree).first; n->parents.insert(this); ret=n->CreateNodeFromVar(i,used,callstack); if(ret!=0) { COUT(ERROR)<<" in "<<((type==DepTree::SAVE)?"save":"print")<<" directive "<<((type==DepTree::SAVE)?G_tosave:G_toprint)[index]->Dump()<<"."<parents.insert(this); } } return 0; } int DepTree::CreateGlobalTree(UsedType& used) { if(parents.size()!=0) { COUT(ERROR)<<"Internal error, DepTree::CreateGlobalTree() call for non-root node."<parents.insert(this); auto ret=n->CreateNodeFromSP(DepTree::SAVE,i,used); if(ret!=0) return ret; } for(G_toType::size_type i=0; iparents.insert(this); auto ret=n->CreateNodeFromSP(DepTree::PRINT,i,used); if(ret!=0) return ret; } return 0; } DepTree* DepTree::FindNodeByVarFromCurrent(const std::string& var) const { if(type==DepTree::VAR && name==var) return const_cast(this); DepTree* d; for(auto& i:childrens) { d=i->FindNodeByVarFromCurrent(var); if(d!=0) return d; } return 0; } DepTree* DepTree::FindNodeByVar(const std::string& var) const { const DepTree* curnode=this; while(curnode->parents.size()!=0) curnode=*(curnode->parents.begin()); return curnode->FindNodeByVarFromCurrent(var); }