www.pudn.com > pl0.zip > pcode.cpp


// pcode.cpp: implementation of the pcode class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "pcode.h" 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
pcode::pcode() 
{ 
	cx=0; 
} 
 
 
void pcode::Gen(fct ff,int ll,int aa) 
{ 
	if(cxcode[cx].f=ff; 
		this->code[cx].l=ll; 
		this->code[cx].a=aa; 
		cx++; 
	} 
} 
 
void pcode::Interpret() 
{ 
	int p,t,l,a; 
	fct f; 
 
	t=0;	//栈顶寄存器 
	b=1;	//基址寄存器 
	p=0;	//程序地址寄存器 
	s[1]=0;	//静态链,指向定义该过程的直接外过程(或主程序)运行时最新数据段的基地址。 
	s[2]=0;	//动态链,指向调用该过程前正在运行过程的数据段基地址。 
	s[3]=0;	//返回地址,记录调用该过程时目标程序的断点,即调用过程指令的下一条指令的地址。 
	do 
	{ 
		f=code[p].f;l=code[p].l;a=code[p].a; 
		p++; 
		switch (f) 
		{ 
		case LIT:			//将常数值取到栈顶,a为常数值 
			s[++t]=a;  
			break; 
		case LOD:           //将变量值取到栈顶,a为偏移量,l为层差 
			s[++t]=s[base(l)+a]; 
			break; 
		case STO:           //将栈顶内容送入某变量单元中,a为偏移量,l为层差 
			s[base(l)+a]=s[t--]; 
			break; 
		case CAL:			//调用过程,a为过程地址,l为层差 
			s[t+1]=base(l);	 
			s[t+2]=b;		 
			s[t+3]=p;		 
			b=t+1; 
			p=a; 
			break; 
		case INT:			//在运行栈中为被调用的过程开辟a个单元的数据区 
			t+=a;break; 
		case JMP:			//无条件跳转至a地址 
			p=a;break; 
		case JPC:			//条件跳转,当栈顶布尔值非真则跳转至a地址,否则顺序执行 
			if (s[t]==0) p=a; 
			t--; 
			break; 
		case RED:			//从命令行读入一个输入置于栈顶 
			t++; 
			cout<<"请输入数据"<>s[t]; 
			s[base(l)+a]=s[t--]; 
			break; 
		case WRT:			//栈顶值输出至屏幕 
			cout<=s[t+1]); 
				break; 
			case 12: t--;	//次栈顶是否大于栈顶,退两个栈元素,结果值进栈 
				s[t]=(s[t]>s[t+1]); 
				break; 
			case 13: t--;	//次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈 
				s[t]=(s[t]<=s[t+1]); 
				break; 
			case 15:		//屏幕输出换行 
				cout<0) 
	{ 
		b1=s[b1]; 
		l--; 
	} 
	return b1; 
} 
 
void pcode::PrintCode() 
{ 
	int i; 
	for (i=0;i