void eprime() { int incoming= relop(); if(incoming == 1) simple_expr(); else return; }
void expr() { simple_expr(); eprime(); }
//反编译 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)",®); 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]",®); 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"); } } }