示例#1
0
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;
    
}
示例#2
0
文件: cprapp.cpp 项目: rrader/cprompt
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
    ;
}
示例#3
0
文件: cprapp.cpp 项目: rrader/cprompt
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";
    }
}