📄 main.c
字号:
//author:谭添升
//
//title:编译器主程序
//将生成在缓存中的虚拟机指令存入文件
//2006年5月25日
#include<stdio.h>
#include"global.h"
extern Code code[NUM_INS];
extern int code_off;
extern int mem_off;
extern FILE * yyin;
void genExeFile();
void init(int argc,char * argv[]);
int main(int argc,char * argv[])
{
init(argc,argv);
yyparse();
if(checkValid()==0){printf("Memory excess the virtue mechine!");exit(1);}
genExeFile(argv[2]);
return 0;
}
int checkValid()
{
if(mem_off>1024)return 0;
return 1;
}
void init(int argc,char * argv[])
{
FILE * temp;
printf("微型语言编译器\nAuthor:谭添升2006年5月28日\n\n");
if(argc<2){printf("Usage:%s soucefile [destfile]",argv[0]);exit(0);}
temp = fopen(argv[1],"r+");
if(temp==NULL){printf("File %s does't exsit.",argv[1]);exit(1);}
yyin=temp;
}
void genExeFile(char * arg) /*将指令数组保存到代码文件*/
{
int i;
FILE * fout;
if(arg!=NULL)
{
fout=fopen(arg,"w+");
}
else fout=fopen("a.txt","w");
if(fout==NULL){printf("openfile destination error!");exit(1);}
for(i=0;i<code_off;i++)
{
switch(code[i].op) /*generate opcode to file*/
{
case op_fcmov: fprintf(fout,"movf\t");break;
case op_cmov:
case op_mov: fprintf(fout,"mov\t");break;
case op_add: fprintf(fout,"+\t");break;
case op_minus: fprintf(fout,"-\t");break;
case op_mult: fprintf(fout,"*\t");break;
case op_div: fprintf(fout,"/\t");break;
case op_mod: fprintf(fout,"%\t");break;
case op_fadd: fprintf(fout,"fadd\t");break;
case op_fminus: fprintf(fout,"fminus\t");break;
case op_fmult: fprintf(fout,"fmult\t");break;
case op_fdiv: fprintf(fout,"fdiv\t");break;
case op_a: fprintf(fout,">\t");break;
case op_ae: fprintf(fout,">=\t");break;
case op_b: fprintf(fout,"<\t");break;
case op_be: fprintf(fout,"<=\t");break;
case op_e: fprintf(fout,"=\t");break;
case op_ne: fprintf(fout,"!=\t");break;
case op_and: fprintf(fout,"and\t");break;
case op_or: fprintf(fout,"or\t");break;
case op_xor: fprintf(fout,"xor\t");break;
case op_neg: fprintf(fout,"neg\t");break;
case op_realtoint:fprintf(fout,"realtoint\t");break;
case op_inttoreal:fprintf(fout,"inttoreal\t");break;
case op_read: fprintf(fout,"read\t");break;
case op_readf: fprintf(fout,"readf\t");break;
case op_write: fprintf(fout,"write\t");break;
case op_writef: fprintf(fout,"writef\t");break;
case op_jmp: fprintf(fout,"jmp\t");break;
case op_zjmp: fprintf(fout,"zjmp\t");break;
}
if(code[i].op==op_fcmov)
{
fprintf(fout,"#%f\t",code[i].src1.fsrc1);
}
if(code[i].op!=op_fcmov&&code[i].src1.isrc1!=-1)
{
fprintf(fout,(code[i].op==op_cmov)?"#%d\t":"%d\t",code[i].src1.isrc1);
}
else fprintf(fout,"\t");
if((code[i].src2!=-1)&&(code[i].op!=op_fcmov))
{
fprintf(fout,"%d\t",code[i].src2);
}
else fprintf(fout,"\t");
if(code[i].dest!=-1) /*generate destination operator*/
{
fprintf(fout,"%d\n",code[i].dest);
}
else fprintf(fout,"\n");
}
fclose(yyin);
if(fout!=NULL)fclose(fout); /*关闭打开的文件*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -