📄 interpret.cpp
字号:
#include "compile.h"
//******************************************************************/
//函数原型:void printDesCode()
//参数说明:无
//函数功能:打印生成的目标代码
//返回值 :无
//******************************************************************/
void printDesCode()
{
maxCodeCount=codeCount;
for(int i=0; i<maxCodeCount; i++)
{
switch(code[i].funCode)
{
case INT: printf("%d\tINT\t%d\n",i,code[i].offset);break;
case LIT: printf("%d\tLIT\t%d\n",i,code[i].offset);break;
case LOD: printf("%d\tLOD\t%s\n",i,table[code[i].offset+1].name);break;
case STO: printf("%d\tSTO\t%s\n",i,table[code[i].offset+1].name);break;
case JMP: printf("%d\tJMP\t%d\n",i,code[i].offset);break;
case JPC: printf("%d\tJPC\t%d\n",i,code[i].offset);break;
case OPR: printf("%d\tOPR\t%d\n",i,code[i].offset);break;
case WRT: printf("%d\tWRT\t%d\n",i,code[i].offset);break;
}
}
printf("\n");
return;
}
//******************************************************************/
//函数原型:void interpret()
//参数说明:无
//函数功能:解释程序
//返回值 :无
//******************************************************************/
void interpret()
{
printf("result:\n");
maxCodeCount=codeCount;
for(int i=0; i<maxCodeCount; i++)
{
switch(code[i].funCode)
{
case INT:
stackCount=code[i].offset;
break;
case LIT:
dataStack[stackCount++]=code[i].offset;
break;
case LOD:
dataStack[stackCount++]=dataStack[code[i].offset];
break;
case STO:
dataStack[code[i].offset]=dataStack[--stackCount];
break;
case JMP:
i=code[i].offset;
i--;//为了抵消每次都要执行的i++
break;
case JPC:
if(dataStack[--stackCount] == FALSE)
{
i=code[i].offset;
i--;//为了抵消每次都要执行的i++
}
break;
case OPR:
switch(code[i].offset)
{
case OPR_PLUS:
dataStack[stackCount-2] = dataStack[stackCount-2] + dataStack[stackCount-1];
stackCount--;
break;
case OPR_MINUS:
dataStack[stackCount-2] = dataStack[stackCount-2] - dataStack[stackCount-1];
stackCount--;
break;
case OPR_TIMES:
dataStack[stackCount-2] = dataStack[stackCount-2] * dataStack[stackCount-1];
stackCount--;
break;
case OPR_SLASH:
dataStack[stackCount-2] = dataStack[stackCount-2] / dataStack[stackCount-1];
stackCount--;
break;
case OPR_OPPO:
dataStack[stackCount-1] = -dataStack[stackCount-1];
break;
case OPR_EQL:
if(dataStack[stackCount-2] == dataStack[stackCount-1])
dataStack[stackCount-2] = TRUE;
else
dataStack[stackCount-2] = FALSE;
stackCount--;
break;
case OPR_LSS:
if(dataStack[stackCount-2] < dataStack[stackCount-1])
dataStack[stackCount-2] = TRUE;
else
dataStack[stackCount-2] = FALSE;
stackCount--;
break;
case OPR_LEQ:
if(dataStack[stackCount-2] <= dataStack[stackCount-1])
dataStack[stackCount-2] = TRUE;
else
dataStack[stackCount-2] = FALSE;
stackCount--;
break;
case OPR_GTR:
if(dataStack[stackCount-2] > dataStack[stackCount-1])
dataStack[stackCount-2] = TRUE;
else
dataStack[stackCount-2] = FALSE;
stackCount--;
break;
case OPR_GEQ:
if(dataStack[stackCount-2] >= dataStack[stackCount-1])
dataStack[stackCount-2] = TRUE;
else
dataStack[stackCount-2] = FALSE;
stackCount--;
break;
case OPR_OR:
if(dataStack[stackCount-2] == TRUE || dataStack[stackCount-1] == TRUE)
dataStack[stackCount-2] = TRUE;
else
dataStack[stackCount-2] = FALSE;
break;
case OPR_AND:
if(dataStack[stackCount-2] == TRUE && dataStack[stackCount-1] == TRUE)
dataStack[stackCount-2] = TRUE;
else
dataStack[stackCount-2] = FALSE;
break;
}
break;
case WRT:
printf("%d\n",dataStack[stackCount-1]);
break;
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -