?? 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 + -