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

📄 interpret.cpp

📁 用VC写的扩充的pl0文法编译器
💻 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 + -