⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是我自己实现的一个微小的编译程序,附可执行代码的虚拟机,是理解编译原理的绝好材料.
💻 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 + -