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

📄 interpret.h

📁 该程序是一个MiniPascal语言的编译器
💻 H
字号:
#ifndef _TRANS_H
#define _TRANS_H
//----------------------------------------------------------------------------------------------//

//							解释程序,仿照老师提供的解释程序完成

//----------------------------------------------------------------------------------------------//

#include<iostream.h>
//interpret;
#define min 0
#define max 8192
int st[max];
int p,s,b;
int stackbottom;
char filename[80];
bool running;
//
fstream outfile("outfile.obj",ios::trunc|ios::in|ios::out);//用于输入和输出的文件,每次打开时都清空。
//
void Error(int lineno,char info[SIZE]){
	cout<<"line:"<<lineno<<"s="<<info<<endl;
	running=false;
}
void programx(int varlength,int templength,int displ,int lineno)
{//功能描述:程序开始,栈顶延伸VarLength+2位
	b=stackbottom;
	s=b+2+varlength;
	if((s+templength)>max){
		Error(lineno,"stack limit");
	}
	else{
		p=p+displ;
	}
}
void endprog(){//功能描述:程序结束,一切OK
	running=false;
}
void procedurex(int varlength,int templength,int displ,int lineno)
{//功能描述:过程头,栈顶延伸VarLength位
	s=s+varlength;
	if((s+templength)>max){
		Error(lineno,"stack limit");
	}
	else{
		p=p+displ;
	}
}
void endproc(int paramlength){//功能描述:过程结束,栈顶后退ParamLength-1位
	s=b-paramlength-1;
	p=st[b+2];
	b=st[b+1];
}
void dox(int displ){//功能描述:栈顶为真则继续执行,栈顶为假则跳转,栈顶后退一位
	if(st[s]==1)
		p=p+2;
	else
		p=p+displ;
}
void gotox(int displ){//功能描述:无条件跳转,栈顶位置不变
	p=p+displ;
}
void proccall(int level,int displ){//功能描述:过程调用,建立静态链、建立动态链、填写返回地址、
//			将控制转移到被调用过程的开始,栈顶延伸三位
	int x=b;
	s++;
	while(level>0){
		x=st[x];
		level--;
	}
	st[s]=x;
	st[s+1]=b;
	st[s+2]=p+3;
	b=s;
	s=b+2;
	p=p+displ;
}
void assign(int length){//功能描述:根据栈顶预先放置的地址和若干个数值,
//			将这些数值赋给此地址开始的一串地址空间中,栈顶后退 length-1 位;
	int x,y,i;
	s=s-length-1;
	x=st[s+1];
	y=s+2;
	i=0;
	while(i<length){
		st[x+i]=st[y+i];
		i++;
	}
	p=p+2;
}
void readx(){//功能描述:读入一个数,置于栈顶存放的地址处,栈顶后退一位
	cin>>st[st[s]];
	s--;
	p++;
}
void writeintx(){//功能描述:将栈顶元素的值输出,栈顶后退一位
	cout<<st[s]<<setw(6)<<endl;
	s--;
	p++;
}
void writebooleanx(){//功能描述:将栈顶元素的值以布尔型输出,栈顶后退一位
	if(st[s]==1)
		cout<<"true"<<endl;
	else cout<<"false"<<endl;
	s--;
	p++;
}
void notequal(){//功能描述:判断栈顶依次存放的两个值的不等关系,将布尔型的结果置于栈顶
//			栈顶后退一位
	s--;
	if(st[s]!=st[s+1])
		st[s]=1;
	else st[s]=0;
	p++;
}
void notless(){//功能描述:判断栈顶依次存放的两个值的大于等于关系,将布尔型的结果置于栈顶
//栈顶后退一位
	s--;
	if(st[s]>=st[s+1])
		st[s]=1;
	else st[s]=0;
	p++;
}
void notgreater(){//功能描述:判断栈顶依次存放的两个值的小于等于关系,将布尔型的结果置于栈顶
//			栈顶后退一位
	s--;
	if(st[s]<=st[s+1])
		st[s]=1;
	else 
		st[s]=0;
	p++;
}
void greater(){//功能描述:判断栈顶依次存放的两个值的大于关系,将布尔型的结果置于栈顶
//			栈顶后退一位
	s--;
	if(st[s]>st[s+1])
		st[s]=1;
	else 
		st[s]=0;
	p++;
}
void Equal(){//功能描述:判断栈顶依次存放的两个值的是否相等,将布尔型的结果置于栈顶
//			栈顶后退一位
	s--;
	if(st[s]==st[s+1])
		st[s]=1;
	else
		st[s]=0;
	p++;
}
void less(){//功能描述:判断栈顶依次存放的两个值的小于关系,将布尔型的结果置于栈顶
//			栈顶后退一位
	s--;
	if(st[s]<st[s+1])
		st[s]=1;
	else
		st[s]=0;
	p++;
}
void orx(){//功能描述:将栈顶依次存放的两个值相或的结果置于栈顶,栈顶后退一位
	s--;
	if(st[s]==0)
		st[s]=st[s+1];
	p++;
}
void subtract(){//功能描述:将栈顶依次存放的两个值相减的结果置于栈顶,栈顶后退一位
	s--;
	st[s]=st[s]-st[s+1];
	p++;
}
void minus(){//功能描述:将栈顶值取相反数,栈顶位置不变
	st[s]=-st[s];
	p++;
}
void add(){//功能描述:将栈顶依次存放的两个值相加的结果置于栈顶,栈顶后退一位
	s--;
	st[s]=st[s]+st[s+1];
	p++;
}
void andx(){//功能描述:将栈顶依次存放的两个值相与的结果置于栈顶,栈顶后退一位
	s--;
	if(st[s]==1)
		st[s]=st[s+1];
	p++;
}
void modulo(){//功能描述:将栈顶依次存放的两个值取模的结果置于栈顶,栈顶后退一位
	s--;
//	if(st[s+1]==0){
//		Error(
	st[s]=st[s]%st[s+1];
	p++;
}
void divide(){//功能描述:将栈顶依次存放的两个值之商置于栈顶,栈顶后退一位
	s--;
	st[s]=st[s]/st[s+1];
	p++;
}
void multiply(){//功能描述:将栈顶依次存放的两个值之积置于栈顶,栈顶后退一位
	s--;
	st[s]=st[s]*st[s+1];
	p++;
}
void notx(){//功能描述:将栈顶值取反,栈顶位置不变
	if(st[s]==1)
		st[s]=0;
	else
		st[s]=1;
	p++;
}
void value(int length){//功能描述:根据栈顶地址,把自该地址开始的若干个变量的值推到栈顶
//栈顶延伸length-1位
	int x,i;
	x=st[s];
	i=0;
	while(i<length){
		st[s+i]=st[x+i];
		i++;
	}
	s=s+length-1;
	p=p+2;
}
void constant(int value){//功能描述:将常数值置于栈顶,栈顶延伸一位
	s++;
	st[s]=value;
	p+=2;
}
void Field(int displ){//功能描述:求记录中域名的地址,栈顶位置不变
	st[s]=st[s]+displ;
	p+=2;
}
void index(int lower,int upper,int length,int lineno)
{//功能描述:求下标变量地址于栈顶,栈顶后退一位
	//if(flag==1)
	//	st[s]=-st[s];
	int i=st[s];
	s--;
	if((i<lower)||(i>upper))
	{
		Error(lineno,"Array range error");
		errorcount++;
		cout<<progname<<".obj- "<<errorcount<<" error(s)"<<endl;
	}
	else st[s]=st[s]+(i-lower)*length;
	p=p+5;
}
void varparam(int level,int displ){//功能描述:求变量的值于栈顶,栈顶延伸一位
	int x=b;
	s++;
	while(level>0){
		x=st[x];
		level--;
	}
	st[s]=st[x+displ];
	p=p+3;
}
void variable(int level,int displ){//功能描述:求变量的地址于栈顶,栈顶延伸一位
	int x=b;
	s++;
	while(level>0){
		x=st[x];
		level--;
	}
	st[s]=x+displ;
	p=p+3;
}
void runprogram(){//功能描述:运行目标代码
	running=true;
	p=min;
	while(running){
		switch(st[p]){
		case 0:add();break;
		case 1:andx();break;
		case 2:assign(st[p+1]);break;
		case 3:constant(st[p+1]);break;
		case 4:divide();break;
		case 5:dox(st[p+1]);break;
		case 6:endproc(st[p+1]);break;
		case 7:endprog();break;
		case 8:endproc(st[p+1]);break;
		case 9:Equal();break;
		case 10:Field(st[p+1]);break;
		case 11:greater();break;
		case 12:gotox(st[p+1]);break;
		case 13:index(st[p+1],st[p+2],st[p+3],st[p+4]);break;
		case 14:less();break;
		case 15:minus();break;
		case 16:modulo();break;
		case 17:multiply();break;
		case 18:notequal();break;
		case 19:notgreater();break;
		case 20:notless();break;
		case 21:notx();break;
		case 22:orx();break;
		case 23:proccall(st[p+1],st[p+2]);break;
		case 24:procedurex(st[p+1],st[p+2],st[p+3],st[p+4]);break;
		case 25:programx(st[p+1],st[p+2],st[p+3],st[p+4]);break;
		case 26:readx();break;
		case 27:subtract();break;
		case 28:value(st[p+1]);break;
		case 29:variable(st[p+1],st[p+2]);break;
		case 30:varparam(st[p+1],st[p+2]);break;
		case 31:writeintx();break;
		case 32:writebooleanx();
		}//switch
	}//while
}
void loadprogram(){//功能描述:载入目标代码(数字串)
	int x=min;
	int ch;
    outfile.seekp(0);
	while(!outfile.eof()){
		outfile>>ch;//跳过任何文件中的空白字符
		st[x]=ch;
		x++;
	}
	stackbottom=x;
	runprogram();
}
#endif

⌨️ 快捷键说明

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