📄 interpreter.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 + -