📄 interpret.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 + -