📄 interpret.cpp
字号:
#include "Global.h"
using namespace std;
void PL0::Interpret()
{
int p,b,t,temp,h1,h2;
INSTRUCTION i;
t=-1,b=0,p=0;
do
{
i=code[p++];
switch(i.f)
{
case Lit:
t++;
s[t]=i.a;
break;
case Opr:
{
switch((int)i.a)
{
case 0://-----------------------返回---------------------//
t=b-1;
p=(int)s[t+3];
b=(int)s[t+2];
break;
case 1://-----------------------取反---------------------//
s[t]=-s[t];
break;
case 2://-----------------------实数加法-----------------//
t--;
s[t]=s[t]+s[t+1];
break;
case 3://-----------------------实数减法-----------------//
t--;
s[t]=s[t]-s[t+1];
break;
case 4://-----------------------实数乘法-----------------//
t--;
s[t]=s[t]*s[t+1];
break;
case 5://-----------------------实数除法-----------------//
t--;
s[t]=(s[t]/s[t+1]);
break;
case 6://-----------------------整数乘法-----------------//
t--;
s[t]=(int)(s[t]*s[t+1]);
break;
case 7://-----------------------整数除法-----------------//
t--;
s[t]=(int)(s[t]/s[t+1]);
break;
case 8://-----------------------整数加法-----------------//
t--;
s[t]=(int)(s[t]+s[t+1]);
break;
case 9://-----------------------整数减法-----------------//
t--;
s[t]=(int)(s[t]-s[t+1]);
break;
case 10://-----------------------相等---------------------//
t--;
if(s[t]==s[t+1])
s[t]=1;
else
s[t]=0;
break;
case 11://-----------------------不等---------------------//
t--;
if(s[t]!=s[t+1])
s[t]=1;
else
s[t]=0;
break;
case 12://-----------------------小于-------------------//
t--;
if(s[t]<s[t+1])
s[t]=1;
else
s[t]=0;
break;
case 13://-----------------------大于-------------------//
t--;
if(s[t]>s[t+1])
s[t]=1;
else
s[t]=0;
break;
case 14://---------------------小于等于------------------//
t--;
if(s[t]<=s[t+1])
s[t]=1;
else
s[t]=0;
break;
case 15://----------------------大于等于-----------------//
t--;
if(s[t]>=s[t+1])
s[t]=1;
else
s[t]=0;
break;
case 16:
s[t]=s[t+4];
break;
}
}
break;
case Stof:
s[t+(int)i.a]=s[t--];
break;
case Fun:
s[b+(int)i.a]=s[t];
break;
case Loda://-----------------------取地址-------------------//
t++;
s[t]=Base((int)i.l,b,s)+i.a;
case Lod://-----------------------取值-------------------//
t++;
temp=Base((int)i.l,b,s);
s[t]=s[temp+(int)i.a];
break;
case Sto://-----------------------存值-------------------//
temp=Base((int)i.l,b,s);
s[temp+(int)i.a]=s[t];
t--;
break;
case Stoi://-----------------------存整数值-------------------//
temp=Base((int)i.l,b,s);
s[temp+(int)i.a]=(int)s[t];
t--;
break;
case F1U:
{
h1=s[t-1];
if(h1<=s[t])
s[(int)s[t-2]]=h1;
else
{
t=t-3;
p=i.a;
}
}
break;
case F2U:
{
h2=s[t-2];
h1=s[h2]+1;
if(h1<=s[t])
{
s[h2]=h1;
p=i.a;
}
else
t=t-3;
}
break;
case F1D:
{
h1=s[t-1];
if(h1>=s[t])
s[(int)s[t-2]]=h1;
else
{
p=i.a;
t=t-3;
}
}
break;
case F2D:
{
h2=s[t-2];
h1=s[h2];
if(h1>=s[t])
{
s[h2]=h1;
p=i.a;
}
else
t=t-3;
}
break;
case Cal:
{
temp=Base((int)i.l,b,s);
s[t+1]=temp;
s[t+2]=b;
s[t+3]=p;
b=t+1;
p=i.a;
}
break;
case Int:
t=t+(int)i.a;
break;
case Jmp:
p=(int)i.a;
break;
case Jpc:
if(s[t]==0)
{
p=i.a;
t--;
}
break;
case Red:
{
float value;
cin>>value;
temp=Base((int)i.l,b,s);
s[temp+(int)i.a]=value;
t--;
}
break;
case Wrt:
cout<<s[t]<<endl;
break;
case Wrts:
{
int leng=i.l+i.a;
for(temp=i.l;temp<leng;temp++)
cout<<str[temp];
}
break;
}
}while(p!=0);
}
int PL0::Base(int l,int b,float* s)
{
int b1;
b1=b;
while(l>0)
{
b1=s[b1];
l--;
}
return b1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -