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

📄 plx.cpp

📁 一个PLX教学编译器IDE
💻 CPP
字号:

#include "plx.h"

plxw::plxw()
{
}

plxw::~plxw()
{
}

/* 虚拟机 */
void plxw::interpret()
{
	t = 0;
	b = 1;
	p = 0;
	
	s[1] = 0;
	s[2] = 0;
    s[3] = 0;

	do{
	    i = code[p];
		p++;

		switch(i.f)
		{
		case LIT : t++;
			       s[t] = i.a;	              
			       break;
		case OPR : switch(i.a)
				   {
			        case 0: t = b-1;    
				            p = s[t+3]; 
							b = 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] = s[t] % s[t+1];
							break;
			        case 7: 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--;
				            s[t] = (int)(s[t] < s[t+1]);
				            break;
			        case 11:t--;
				            s[t] = (int)(s[t] >= s[t+1]);
				            break;
			        case 12:t--;
				            s[t] = (int)(s[t] > s[t+1]);
				            break;
			        case 13:t--;
				            s[t] = (int)(s[t] <= s[t+1]);
				            break;  
			        case 14:t--;
				            s[t] = (int)(s[t] | s[t+1]);
				            break;  
			        case 15:t--;
				            s[t] = (int)(s[t] & s[t+1]);
				            break; 
			        case 16:s[t] = (int)(!s[t]);
				            break; 
				   }
			       break;
		case LOD : s[t] = s[base(i.l)+i.a + s[t]];	
			       break;		
		case STO : t--;
			       s[base(i.l)+i.a + s[t]] = s[t+1];			  			 		
			       t--;                 
			       break;			
		case CAL : s[t+1] = base(i.l) ;
			       s[t+2] = b;
				   s[t+3] = p;
				   b = t + 1;
				   p = i.a;			
			       break;		
		case INT : t = t + i.a;
			       break;		
		case JMP : p = i.a;			     
			       break;		
		case JPC : if(s[t] == 0)
				   {
				       p = i.a;
				   }
			       t--;
			       break;
		case SHO : printf("%d \n",s[t]);
			       t--;
				   break;
		default  :;
		}	
	}while( p != 0);
}

/* 计算静态链地址 */
int plxw::base(int l)
{
	int b1 = b;
	int l1 = l;

	while(l1 > 0)
	{
	   b1 = s[b1];
	   l1 = l1 - 1;  
	}

    return b1;
}

void plxw::debug(char *filePath)
{	
	InFile.open(filePath);

	if(!InFile.fail())
	{
		fillCode();
	}else
	{
	    cout<<"the object file is not exist or cann't open it.";
	}
}

void plxw::fillCode()
{
	int f;
	int l;
	int a;

	int i = 0;

    while(true)
	{
        if(InFile.eof())
		{
		   if(i != 0)
		   {
		      this->interpret();
			  return;
		   }
		}
		
		InFile>>f;
        InFile>>l;
        InFile>>a;

		code[i].f = f;
		code[i].l = l;
		code[i].a = a;

		i++;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -