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

📄 objcode.cpp

📁 PL语言到中间代码的编译程序
💻 CPP
字号:
#include "common.h"

ObjItem ObjCodeHead;
ObjItem *CurrentCode=&ObjCodeHead;

char ObjCodeScript[GE+1][50]=
{
	"LIT	%d , %d		;装入常量",
	"LOD	%d , %d		;装入变量值",
	"ILOD	%d , %d		;间接装入",
	"LODA	%d , %d		;装入变量地址",
	"LODT			;装入栈顶值为地址的内容",
	"LODB	%d , %d		;装入长度为A的块",
	"STO			;将栈顶值存入栈顶次值所指单元",
	"CPYB	%d , %d		;传送长度为A的块",
	"JMP	%d , %d		;无条件跳转",
	"JPC	%d , %d		;栈顶值为0时跳转",
	"READ	%d , %d		;读指令",
	"WRITE	%d , %d		;写指令",
	"CALL	%d , %d		;转子",
	"RETP			;过程返回",
	"UDIS	%d , %d		;调整Display",
	"OPAC			;打开活动记录",
	"ENTP	%d , %d		;进入过程",
	"ENDP			;程序结束",
	"AND",
	"OR",
	"NOT",
	"IMOD",
	"MUS",
	"ADD",
	"SUB",
	"MULT",
	"IDIV",
	"EQ==",
	"NEQ!=",
	"LSS			;<",
	"LEQ			;<=",
	"GTR			;>",
	"GEQ			;>="
};

ObjItem *GenerateCode(int ins,int sop,int dop)
{
	ObjItem *last;
	static int line_number=1;

	if(!CurrentCode)
	{
		Error(7);
		exit(4);
	}
	CurrentCode->Instruction=ins;
	CurrentCode->SrcOp=sop;
	CurrentCode->DestOp.iValue=dop;
	CurrentCode->Next=new ObjItem; 
	last=CurrentCode;
	CurrentCode=CurrentCode->Next; 
	CurrentCode->Next=NULL;
	CurrentCode->LineNum=line_number++; 
#ifdef _DEBUG
	printf("%d\t",line_number-2);
	printf(ObjCodeScript[ins],sop,dop);
	printf("\n");
#endif
	return last;
}

void ClearObjCode()
{
	ObjItem *current,*need_del;
	for(current=ObjCodeHead.Next;current;)
	{
		need_del=current;
		current=current->Next;
		delete need_del;		
	}
}

void WriteCodeList(char *filename)
{
	FILE *lst;
	ObjItem *current;

	lst=fopen(filename,"wt");
	if(!lst)
		Error(29);
	for(current=&ObjCodeHead;current && current->Next;current=current->Next)
	{
		fprintf(lst,"%d\t",current->LineNum);
		fprintf(lst,ObjCodeScript[current->Instruction],current->SrcOp,current->DestOp);
		fprintf(lst,"\n");		
	}
	fclose(lst);
}

void WriteObjCode(char *filename)
{
	FILE *lst;
	ObjItem *current;

	lst=fopen(filename,"wb");
	if(!lst)
		Error(29);
	for(current=&ObjCodeHead;current && current->Next;current=current->Next)
	{
		fwrite(&current->Instruction,sizeof(int),1,lst);
		fwrite(&current->SrcOp,sizeof(int),1,lst);
		fwrite(&current->DestOp,sizeof(int),1,lst);
	}
	fclose(lst);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -