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