Ejemplo n.º 1
0
void eprime()
{
	int incoming= relop();
	if(incoming == 1)
		simple_expr();		
	else
		return;
}
Ejemplo n.º 2
0
void expr()
{
	simple_expr();
	eprime();
}
Ejemplo n.º 3
0
//反编译
void recompiler()
{
	int i=0;
	char op[expr_size],fuc1[expr_size],fuc2[expr_size];
	for(i=1;i<num_inst;i++)
	{
		extra_judge(i);//额外的判断,目前为增加  }
		sscanf(inst[i],"%s %s %s",op,fuc1,fuc2);
		//cout <<"run "<<i<<": "<<inst[i]<<endl;
		if(strcmp(op,"nop")==0)//空指令
			continue;
		else if(strcmp(op,"entrypc")==0)//指示main函数
		{
			fprintf(fw,"void main(");
			local_define(i+1);//局部变量检测与定义
			i++;
		}
		else if(strcmp(op,"enter")==0)//函数的定义
		{
			fprintf(fw,"void fuction_%d(",i);
			local_define(i+1);//函数的局部变量检测
			continue;
		}
		else if(strcmp(op,"cmpeq")==0)//比较相等
		{
			cmp_inst(op,fuc1,fuc2,"==","!=",i);//判断语句的识别,包括了while
		}
		else if(strcmp(op,"cmple")==0)//比较小于等于
		{
			cmp_inst(op,fuc1,fuc2,"<=",">",i);
		}
		else if(strcmp(op,"cmplt")==0)//比较小于
		{
			cmp_inst(op,fuc1,fuc2,"<",">=",i);
		}
		else if(strcmp(op,"load")==0)//加载内存数据,全局变量,结构体,数组
		{
			int reg=0;
			sscanf(fuc1,"(%d)",&reg);
			transform_load(reg,i);//load指令的转化,转化为一个简单的表达式,用于之后的使用
		}
		else if(strcmp(op,"store")==0)//存储内存数据,全局变量,结构体,数组
		{
			char v1[expr_size],v2[expr_size];
			int reg1,reg2=0;
			int t1=get_op(fuc1,v1,reg1);//获取当前参数是 常数,变量(全局/局部),表达式
			int t2=get_op(fuc2,v2,reg2);

			if(t1==2)
				get_expr(reg1,v1);//获取表达式
			if(t2==2)
				get_expr(reg2,v2);

			sprintf(inst[i]," %s=%s",v2,v1);
			add_tab();//添加tab
			fprintf(fw,"%s=%s;\n",v2,v1);
		}
		else if(strcmp(op,"expr")==0)
		{
			int n=0;
			sscanf(fuc1,"%d",&n);
			get_expr(n,fuc1);
		}
		else if(strcmp(op,"param")==0)//参数,用于函数调用
		{
			translate_fuc(i);//函数调用转化,带参数,返回时为call指令
		}
		else if(strcmp(op,"call")==0)//无参数的函数调用
		{
			int reg=0;
			sscanf(fuc1,"[%d]",&reg);
			add_tab();
			fprintf(fw,"fuction_%d();\n");
		}
		else if(strcmp(op,"else")==0)//辅助指令,用于else
		{
			add_tab();
			fprintf(fw,"else\n");
			add_tab();
			fprintf(fw,"{\n");
			num_big++;
			int t=0;
			sscanf(fuc1,"%d",&t);
			extra[t]++;
		}
		else if(strcmp(op,"write")==0)//输出
		{
			char v1[expr_size];
			int reg=0;
			int t=get_op(fuc1,v1,reg);
			if(t==2)
				get_expr(reg,v1);
			add_tab();
			fprintf(fw,"WriteLong(%s);\n",v1);
		}
		else if(strcmp(op,"wrl")==0)//换行
		{
			add_tab();
			fprintf(fw,"WriteLine();\n");
		}
		else if(simple_expr(op))//简单的表达式,add,sub,mul,div,mod,neg,move
		{
			char dst[expr_size];
			get_expr(i,dst);
			if(strcmp(op,"move")==0)
			{
				add_tab();
				fprintf(fw,"%s;\n",dst);
			}
		}
		else if(strcmp(op,"ret")==0)//函数返回指令
		{
			num_big--;
			add_tab();
			fprintf(fw,"}\n");
		}
	}
}