int ExecTree(Node *tree, int bg) { //解析二叉树 if(tree==NULL) return 1; if(tree->lchild==NULL && tree->rchild==NULL) { return Interpret(tree->data,-1,NULL,bg); } if(tree->data[0]=='&') { if(ExecTree(tree->lchild,1) && ExecTree(tree->rchild,0)) return 1; else return 0; } if(tree->data[0]=='>') { return Interpret(tree->lchild->data,1,tree->rchild->data,bg); } else if(tree->data[0]=='<') { return Interpret(tree->lchild->data,0,tree->rchild->data,bg); } else if(tree->data[0]=='|') { int fds[2],pid; pipe(fds); pid=fork(); if(pid>0) //父进程 { int sfd=dup(STDIN_FILENO); //先把标准输入保存下来 dup2(fds[0],STDIN_FILENO); //管道重定向到标准输入 close(fds[1]); close(fds[0]); ExecTree(tree->rchild,bg); waitpid(pid,NULL,0); dup2(sfd,STDIN_FILENO); //还原标准输入 } else //子进程 { dup2(fds[1],STDOUT_FILENO); //管道重定向到标准输出 close(fds[0]); close(fds[1]); ExecTree(tree->lchild,bg); //这里的bg情况暂时搞不清楚 exit(0); } } return 1; }
void CPRApplication::ExecMainTree(ag::tree<CPRTreeNode*>* T) { ag::tree<CPRTreeNode*>* tFuncs=T->childs[0]->data; ag::tree<CPRTreeNode*>* mainf=FindText2InTree(tFuncs,"main"); if (mainf==NULL) { if (debugmode) std::cout<<"(FATAL ERROR) Function 'main' not found. Terminated."; return; } if (debugmode) mainf->drawtree_con(&std::cout); if (debugmode) std::cout<<"function parameter argc="<<argc-1<<"\n"; DTInt* L=new DTInt("argc",argc-argnum); DTArray* cpargv=new DTArray("argv",sizeof(char*),argc-argnum,"char*"); DTVar* m=DTVar::CreateNativeDTVarFromDTMain(cpargv); aStack.push(m); aStack.push(DTVar::CreateNativeDTVarFromDTMain(L)); char* ss; void** tmp; for(int i=argnum;i<argc;i++) { //tmp=new void*; ss=new char[strlen(argv[i])+1]; strcpy(ss,argv[i]); ss[strlen(argv[i])]=0; cpargv->FillElement(i-argnum,ss); } for(int i=0;i<cpargv->count;i++) if (debugmode) std::cout<<"cpargv["<<i<<"]:: "<<((DTMain*)(((DTVar*)(cpargv->GetElement(i)))->T))->tostring()<<"\n"; if (debugmode) std::cout<<"DTArray.tostring(): \""<<cpargv->tostring()<<"\"\n"; L=new DTInt(NULL,2); aStack.push(DTVar::CreateNativeDTVarFromDTMain(L)); //test /* int k=*((unsigned int*)(((DTUInt*)(((DTVar*)(aStack.pop()))->T))->pData)); DTArray& a; a=(*aStack.pop())->T; for(int i=0;i<k;i++) { if (debugmode) std::cout<<i<<"\n"; try{ tmp=(((DTArray*)((*).T))->GetElement(i)); if (debugmode) std::cout<<i<<"\n"; if (debugmode) std::cout<<"pop: cpargv["<<i<<"]:: "<<tmp<<"\n"; } catch (...){ if (debugmode) std::cout<<"(INTERNAL ERROR) 1\n"; } } */ if (debugmode) std::cout<<"\n\n"; ExecTree(mainf); //recoursively run all childs ; }
void CPRApplication::ExecTree(ag::tree<CPRTreeNode*>* T,ag::list<DTVar*>* ExternalVars, char* retname) { try { ag::list<DTVar*> Local; //ag::list<CPRRestoreVarName*> ToRestore; if (ExternalVars!=NULL) { DTVar* q; rpnlist* rl; RPNStackElement* rse; DTVar* dv; for (ag::list<DTVar*>::member m=ExternalVars->head;m!=NULL;m=m->next) { Local.add_tail(m->data); } } OutVarList(&Local); bool was_ret=false; char* sq_s; if (T->data->tntType==tntFunction) {//if it's function, load arguments from stack to Local. search from the end int c=((ag::list<CPRTextDataType>*)(T->data->r1))->count(); int c_k=((DTMain*)(aStack.pop()->T))->toint(); if (c!=c_k) if (debugmode) std::cout<<"(WARNING) Params count is not equally to declaration\n"; ag::list<CPRTextDataType>::member pm=((ag::list<CPRTextDataType>*)(T->data->r1))->head; OutVarList(&Local); ag::list<DTVar*>::member m; for (int i=0;i<c;i++) { OutVarList(&Local); m=Local.add_tail(aStack.pop());// названия OutVarList(&Local); //CPRRestoreVarName* rvn=new CPRRestoreVarName; //rvn->mem=m; //rvn->name=new char[strlen(((DTMain*)(m->data->T))->sIdent)+1]; //strcpy(rvn->name,((DTMain*)(m->data->T))->sIdent); //rvn->name[strlen(rvn->name)]=0; //ToRestore.add_tail(rvn); ((DTMain*)(m->data->T))->sIdent=pm->data.str2; OutVarList(&Local); pm=pm->next; } OutVarList(&Local); std::string sq=T->data->text2; sq+="_result_"; // std::ostringstream si; // si << rand(); // sq+=si.str(); sq_s=new char[sq.size()+1]; strcpy(sq_s,sq.c_str()); sq_s[sq.size()]=0; DTVar* r=ParseDataTypeString(T->data->text,sq_s,NULL,&Local); Local.add_tail(r); }else { sq_s=retname; } OutVarList(&Local); ag::listmember< ag::tree<CPRTreeNode*>* >* p=(*T).childs.head; while (p!=NULL) { switch(p->data->data->tntType) { case tntDeclareVar: { //if (p->data->data->text3) if (debugmode) std::cout<<" : Declarating variable: "<<p->data->data->text<<", "<<p->data->data->text2; if (p->data->data->text3!=NULL) { if (debugmode) std::cout<<" = "<<p->data->data->text3; } if (debugmode) std::cout<<"; regular variable\n"; try { std::string rpnstr; /*rpnstr=p->data->data->text2; rpnstr+="=";*/ rpnstr+=(p->data->data->text3)?p->data->data->text3:""; DTVar* dtv=ParseDataTypeString(p->data->data->text,p->data->data->text2,//p->data->data->text3); NULL, NULL); Local.add_tail(dtv); rpnlist* rls; rls=MakePostfixFromInfix((char*)rpnstr.c_str()); RPNStackElement* rlsel=new RPNStackElement; rlsel->d=p->data->data->text2; rlsel->tp=rsetStr; rls->add_head(rlsel); rlsel=new RPNStackElement; rlsel->d=new char[3]; ((char*)rlsel->d)[0]='='; ((char*)rlsel->d)[1]=' '; ((char*)rlsel->d)[2]=0; rlsel->tp=rsetAct; rls->add_tail(rlsel); OutVarList(&Local); CalculateRPN(rls,&Local); OutVarList(&Local); if (debugmode) std::cout<<"variable was added to Local\n"; if (debugmode) std::cout<<((DTMain*)(dtv->T))->DTFullName()<<"\n"; }catch(char* k) { if (debugmode) std::cout<<"(Error): "<<k<<"\n"; } catch(const char* k) { if (debugmode) std::cout<<"(Error): "<<k<<"\n"; }; //((DTMain*)(dtv->T))->; OutVarList(&Local); break; } case tntDeclareFunc: { break; } case tntFunction: { break; } case tntIF: { ag::stack<DTVar*>* g= CalculateRPN((rpnlist*)p->data->data->r1, &Local); DTMain* if_ex=((DTMain*)(g->pop()->T)); if (if_ex->typeoftype()!=1) { char* qerr=new char[strlen("Result of expression at \"if\" must be integer type!")+1]; strcpy(qerr,"Result of expression at \"if\" must be integer type!"); qerr[strlen("Result of expression at \"if\" must be integer type!")]=0; throw qerr; } CPRTreeNodeType r; if (((DTIntegerTypes*)(if_ex))->toint()) r=tntIFTrue; else r=tntIFFalse; ag::tree<CPRTreeNode*>* call; for(ag::list<ag::tree<CPRTreeNode*>*>::member i=p->data->childs.head;i!=NULL;i=i->next) { if (i->data->data->tntType==r) { call=i->data; break; } } ExecTree(call,&Local,sq_s); break; } case tntWhileLoop: { bool bOk; do { ag::stack<DTVar*>* g= CalculateRPN((rpnlist*)p->data->data->r1, &Local); DTMain* if_ex=((DTMain*)(g->pop()->T)); if (if_ex->typeoftype()!=1) { char* qerr=new char[strlen("Result of expression at \"while\" must be integer type!")+1]; strcpy(qerr,"Result of expression at \"while\" must be integer type!"); qerr[strlen("Result of expression at \"while\" must be integer type!")]=0; throw qerr; } bOk=(((DTIntegerTypes*)(if_ex))->toint()); if (bOk) ExecTree(p->data,&Local,sq_s); }while (bOk); break; } case tntDoWhileLoop: { bool bOk; do { ExecTree(p->data,&Local,sq_s); ag::stack<DTVar*>* g= CalculateRPN((rpnlist*)p->data->data->r1, &Local); DTMain* if_ex=((DTMain*)(g->pop()->T)); if (if_ex->typeoftype()!=1) { char* qerr=new char[strlen("Result of expression at \"while\" must be integer type!")+1]; strcpy(qerr,"Result of expression at \"while\" must be integer type!"); qerr[strlen("Result of expression at \"while\" must be integer type!")]=0; throw qerr; } bOk=(((DTIntegerTypes*)(if_ex))->toint()); }while (bOk); break; } case tntForLoop: { bool bOk; do { ag::stack<DTVar*>* g= CalculateRPN((rpnlist*)p->data->data->r2, &Local); DTMain* if_ex=((DTMain*)(g->pop()->T)); if (if_ex->typeoftype()!=1) { char* qerr=new char[strlen("Result of expression at \"for\" must be integer type!")+1]; strcpy(qerr,"Result of expression at \"for\" must be integer type!"); qerr[strlen("Result of expression at \"for\" must be integer type!")]=0; throw qerr; } bOk=(((DTIntegerTypes*)(if_ex))->toint()); if (bOk) ExecTree(p->data,&Local,sq_s); }while (bOk); break; } case tntExpression: { CalculateRPN((rpnlist*)p->data->data->r1, &Local); break; } case tntReturn: { if (sq_s==NULL) throw "return is not allowed in this context"; ag::stack<DTVar*>* g= CalculateRPN((rpnlist*)p->data->data->r1, &Local); DTVar* ret_var=FindVariable(sq_s,&Local); DTMain* qw=(DTMain*)(g->pop()->T); DTMain* er=(DTMain*)(ret_var->T); CalculateAssignation(er,qw,&Local); aStack.push(ret_var); //if ((DTMain*)(ret_var->T)->typeoftype()==) return; break; } case tntDirective: { DTVar* g; if (debugmode) std::cout<<"#"<<p->data->data->text<<"\n"; CPRParser* pd=new CPRParser(p->data->data->text); pd->Next(); if (strcmp(pd->sCurrText,"pragma")==0) { pd->Next(); if (strcmp(pd->sCurrText,"out")==0) { pd->Next(); char* svar=pd->ReadIdent(); if (debugmode) std::cout<<"out("<<svar<<")\n"; DTVar* x=FindVariable(svar,&Local); if (x!=NULL) { if (debugmode) std::cout<<svar<<" = "<< (((DTMain*)(x->T))->tostring()) <<"\n"; }else { if (debugmode) std::cout<<svar<<" not found!"; } // for(ag::list<DTVar*>::member i=aVars.head;i!=NULL;i=i->next) // { // g=(DTVar*)(i->data); // if (((DTMain*)(g->T))->sIdent==NULL) continue; // if (strcmp((((DTMain*)(g->T))->sIdent),svar)==0) // { // if (debugmode) std::cout<<svar<<" = "<< (((DTMain*)(g->T))->tostring()) <<"\n"; // break; // }; // }; }; }; break; } }; p=p->next; }; if (T->data->tntType==tntFunction) aStack.push(FindVariable(sq_s,&Local)); // for (ag::list<CPRRestoreVarName*>::member m=ToRestore.head;m!=NULL;m=m->next) // { // ((DTMain*)(m->data->mem->data->T))->sIdent=m->data->name; // } }catch(char* k) { if (debugmode) std::cout<<"(Error): "<<k<<"\n"; } catch(const char* k) { if (debugmode) std::cout<<"(Error): "<<k<<"\n"; } }