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

📄 interpreter.cpp

📁 pl0文法编译器
💻 CPP
字号:
#include "interpreter.h"
#include "Code.h"
#include <iostream>

using namespace std;

Interpreter::Interpreter(string fileName)
:inStream(fileName.c_str()),codeStack(pcode->getCodeStack()),
 stringStack(pcode->getStringStack())
{
	if(!inStream)
	{
		cout<<"目标代码文件无法打开"<<endl;
		exit(0);
	}
	else
	{
		pcode = new Code(this);
		base = 0;//数据段基地址
		p = 0;//指令指针
		t = -1;//栈顶寄存器
	}
}

int Interpreter::getBase(int l)
{
	int b1 = base;
	for( ; l > 0; l--)
		b1 = bBlock[b1];
	return b1;
}

void Interpreter::listCode()
{
	pcode->list();
}

void Interpreter::interpret()
{
	cout<<"Interpret Pcode..."<<endl<<endl;
	Instruction ins;
	float val = 0;
	StringStack::iterator iter = pcode->getStringStack().begin();
	do
	{
		//ins = codeStack[p];
		if(t>=opStack.size())
			opStack.resize(opStack.size()*2);
		ins = (Instruction)pcode->getCodeStack().at(p);
		p++;
		switch(ins.code)
		{
		case LITCH:
			val = ins.a;
			t++;
			opStack.push_back((char)val);
			break;
		case LITI:
			val = ins.a;
			t++;
			opStack.push_back((int)val);
			break;
		case LITR:
			t++;
			opStack.push_back(ins.a);
			break;
		case LODCH:
			t++;
			opStack.push_back((char)bBlock[getBase(ins.l)+ins.a]);
			break;
		case LODI:
			{
				t++;
				int ceshi = (int)bBlock[getBase(ins.l)+ins.a];
				opStack.push_back(ceshi);
				break;
			}
			
		case LODR:
			t++;
			opStack.push_back(bBlock[getBase(ins.l)+ins.a]);
			break;
		case STO:
			bBlock[getBase(ins.l)+ins.a] = opStack[t--];
			opStack.pop_back();
			break;
		case READI:
			cout<<"integer:  ";
			cin>>bBlock[getBase(ins.l)+ins.a];
			break;
		case READR:
			cout<<"real:  ";
			cin>>bBlock[getBase(ins.l)+ins.a];
			break;
		case READS:
			{
				char chara ;
				cout<<"char:  ";
				cin>>chara;
				bBlock[getBase(ins.l)+ins.a] = (int)chara;
				break;
			}
		case WRTCH:
			cout<<(char)opStack[t--]<<endl;
			opStack.pop_back();
			break;
		case WRTI:
			cout<<(int)opStack[t--]<<endl;
			opStack.pop_back();
			break;
		case WRTR:
			cout<<opStack[t--]<<endl;
			opStack.pop_back();
			break;
		case WRTSTR:
			{
				iter = pcode->getStringStack().begin();
				for(int i = 0; i < ins.a; iter++,i++);
				cout<<*iter<<endl;
				break;
			}
		case JMP:
			p = ins.a;
			break;
		case JPC:
			if(opStack[t--]==0)
				p = ins.a;
			opStack.pop_back();
			break;
		case REV:
			opStack[t] = 0-opStack[t];
			break;
		case ADD:
			t--;
			opStack[t] = opStack[t] + opStack[t+1];
			opStack.pop_back();
			break;
		case MIN:
			t--;
			opStack[t] = opStack[t] - opStack[t+1];
			opStack.pop_back();
			break;
		case TIM:
			{
				t--;
				float ceshi1,ceshi2,ceshi3;
				ceshi1 = opStack[t];
				ceshi2 = opStack[t+1];
				opStack[t] = ceshi3 = opStack[t] * opStack[t+1];
				opStack.pop_back();
				break;
			}
		case DIV:
			{
				t--;
				float ceshi1,ceshi2,ceshi3;
				ceshi1 = opStack[t];
				ceshi2 = opStack[t+1];
				opStack[t] = ceshi3 = opStack[t] / opStack[t+1];
				opStack.pop_back();
				break;
			}
		case DIVI:
			{
				{
					t--;
					float ceshi1,ceshi2,ceshi3;
					ceshi1 = opStack[t];
					ceshi2 = opStack[t+1];
					opStack[t] = ceshi3 = (int)(opStack[t] / opStack[t+1]);
					opStack.pop_back();
					break;
				}
			}
		case EQU:
			t--;
			if(opStack[t]==opStack[t+1])
				opStack[t] = 1;
			else 
				opStack[t] = 0;
			opStack.pop_back();
			break;
		case NEQU:
			t--;
			if(opStack[t]!=opStack[t+1])
				opStack[t] = 1;
			else 
				opStack[t] = 0;
			opStack.pop_back();
			break;
		case GRT:
			t--;
			if(opStack[t] > opStack[t+1])
				opStack[t] = 1;
			else 
				opStack[t] = 0;
			opStack.pop_back();
			break;
		case GRTEQ:
			t--;
			if(opStack[t] >= opStack[t+1])
				opStack[t] = 1;
			else 
				opStack[t] = 0;
			opStack.pop_back();
			break;
		case LES:
			t--;
			if(opStack[t] < opStack[t+1])
				opStack[t] = 1;
			else 
				opStack[t] = 0;
			opStack.pop_back();
			break;
		case LESEQ:
			t--;
			if(opStack[t] <= opStack[t+1])
				opStack[t] = 1;
			else 
				opStack[t] = 0;
			opStack.pop_back();
			break;
		case CALL:
			{
				int top = bBlock.size()-1;
				bBlock.resize(bBlock.size()+4);
				bBlock[top+1] = getBase(ins.l);//动态链
				bBlock[top+2] = base;//pre abp
				bBlock[top+3] = p;//返回地址
				base = top+1;
				p = ins.a;
				break;
			}
		case ALOC:
			if(ins.l < 0)
			{
				bBlock.resize(ins.a+4);
				bBlock[0] = 0; bBlock[1]=0;bBlock[2] = 0; bBlock[3] = 0;
			}
			else
			{
				bBlock.resize(bBlock.size()+ins.a);
			}
			break;
		case RTN:
			{
				int n = bBlock.size()-base;
				t++;
				opStack.push_back(bBlock[base+3]);
				p = bBlock[base+2];
				base = bBlock[base+1];
			}
		default: break;
		}
	}while(p != 0);
}

⌨️ 快捷键说明

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