📄 fc-interpret.cpp
字号:
#include "stdafx.h"
#include "FC.h"
#include "FCDlg.h"
#include "FCInputDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BOOL CFCDlg::TestAddress(int iAddress)
{
if(iAddress>=nMEMORY)
{
Output("\r\n地址溢出,程序停止执行!\r\n");
MessageBeep(0);
return FALSE;
}
return TRUE;
}
BOOL CFCDlg::ZeroSlashMod(int i)
{
if(i==0)
{
Output("\r\n“/”或“%”的右操作数为0,程序停止执行!\r\n");
MessageBeep(0);
return FALSE;
}
return TRUE;
}
BOOL CFCDlg::ZeroSlashMod(double d)
{
if(d==0.0)
{
Output("\r\n“/”或“%”的右操作数为0,程序停止执行!\r\n");
MessageBeep(0);
return FALSE;
}
return TRUE;
}
BOOL CFCDlg::ArraySubscript(int index,int length)
{
if(index<0 || (length>=0 && index>=length))
{
Output("\r\n数组下标溢出,程序停止执行!\r\n");
MessageBeep(0);
return FALSE;
}
return TRUE;
}
BOOL CFCDlg::ValideArray(void *pArray)
{
if(pArray==NULL)
{
Output("\r\n无法分配数组空间,程序停止执行!\r\n");
MessageBeep(0);
return FALSE;
}
return TRUE;
}
// CFCDlg 运行函数
BOOL CFCDlg::Interpret(void)
{
const double m_iCode=0;//定义此变量只是为了屏蔽外部成员变量
int i,n,iTemp;
double dTemp;
register int iBase=0; //函数基地址
register int iCode=0; //代码指针
register int iAddress=0; //地址指针
ZMemory memory[nMEMORY]; //虚内存
register int iOp; //指令条数计数
BOOL bWarning=TRUE; //是否对可能的死循环进行警告
clock_t tStart,tElapse=0;
tStart=clock();
for(iOp=0;;iOp++)
{
if(iOp==17333 && bWarning)//17333只是表示173班33号,无其他意义
{
tElapse+=clock()-tStart;
switch(MessageBox("\
程序可能进入死循环,要中止解释执行吗?\n\
按“是”中止解释执行,按“否”继续解释执行\n\
按“取消”继续解释执行并不再显示此消息框",
"FC 2.2",MB_YESNOCANCEL|MB_ICONQUESTION))
{
case IDYES:
tStart=clock();
goto EndInterpret;
//此处无需break语句
case IDCANCEL:
bWarning=FALSE;
//此处不填入break语句
case IDNO:
tStart=clock();
iOp=0;
break;
}
}
switch(m_code[iCode].op)
{
case OP_AND: //逻辑与
if(memory[iAddress-1].iNumber!=0 && memory[iAddress].iNumber!=0)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_CALL: //调用函数
if(!TestAddress(iAddress+3))// +3 是因为下边需要3单元虚内存
return FALSE;
memory[iAddress+1].iNumber=iBase; //保留原基地址
memory[iAddress+2].iNumber=iAddress;//保留原栈顶指针
memory[iAddress+3].iNumber=iCode; //保留原中间代码指针
iBase=iAddress+1;
iCode=m_code[iCode].sd.iNumber;
iAddress+=m_code[iCode].sd.iNumber+3;
iCode++;
break;
case OP_CHANGESIGNALD: //实数变号
memory[iAddress].dNumber= -memory[iAddress].dNumber;
iCode++;
break;
case OP_CHANGESIGNALI: //整数变号
memory[iAddress].iNumber= -memory[iAddress].iNumber;
iCode++;
break;
case OP_COPYD: //复制栈顶实数
iAddress++;
if(!TestAddress(iAddress))
return FALSE;
memory[iAddress].dNumber=memory[iAddress-1].dNumber;
iCode++;
break;
case OP_COPYI: //复制栈顶整数
iAddress++;
if(!TestAddress(iAddress))
return FALSE;
memory[iAddress].iNumber=memory[iAddress-1].iNumber;
iCode++;
break;
case OP_D2I: //实数变整数
memory[iAddress+m_code[iCode].sd.iNumber].iNumber=
(int)memory[iAddress+m_code[iCode].sd.iNumber].dNumber;
iCode++;
break;
case OP_DELARRAYD: //删除实数数组
delete memory[iBase+3+m_code[iCode].sd.iNumber].dArray;
iCode++;
break;
case OP_DELARRAYI: //删除整型数组
delete memory[iBase+3+m_code[iCode].sd.iNumber].iArray;
iCode++;
break;
case OP_DELETE: //删除栈顶数
iAddress--;
iCode++;
break;
case OP_EQUALD: //实数相等
if(memory[iAddress-1].dNumber == memory[iAddress].dNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_EQUALI: //整数相等
if(memory[iAddress-1].iNumber == memory[iAddress].iNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_EXIT: //程序结束标志
goto EndInterpret;
case OP_GREATD: //实数大于
if(memory[iAddress-1].dNumber > memory[iAddress].dNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_GREATEQUALD: //实数大于等于
if(memory[iAddress-1].dNumber >= memory[iAddress].dNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_GREATEQUALI: //整数大于等于
if(memory[iAddress-1].iNumber >= memory[iAddress].iNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_GREATI: //整数大于
if(memory[iAddress-1].iNumber > memory[iAddress].iNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_I2D: //整数变实数
memory[iAddress+m_code[iCode].sd.iNumber].dNumber=
(double)memory[iAddress+m_code[iCode].sd.iNumber].iNumber;
iCode++;
break;
case OP_INPUTARRAYD: //输入实数数组
iTemp=iBase+3+m_code[iCode].sd.iNumber;//数组头位置
i=memory[iAddress].iNumber;//数组下标
if(!ArraySubscript(i,memory[iTemp].length))//下标检查
return FALSE;
tElapse+=clock()-tStart;
memory[iTemp].dArray[i]=InputDouble();
tStart=clock();
iAddress--;
iCode++;
break;
case OP_INPUTARRAYI: //输入整数数组
iTemp=iBase+3+m_code[iCode].sd.iNumber;//数组头位置
i=memory[iAddress].iNumber;//数组下标
if(!ArraySubscript(i,memory[iTemp].length))//下标检查
return FALSE;
tElapse+=clock()-tStart;
memory[iTemp].iArray[i]=InputInt();
tStart=clock();
iAddress--;
iCode++;
break;
case OP_INPUTD: //输入实型值
tElapse+=clock()-tStart;
memory[iBase+3+m_code[iCode].sd.iNumber].dNumber=InputDouble();
tStart=clock();
iCode++;
break;
case OP_INPUTI: //输入整型值
tElapse+=clock()-tStart;
memory[iBase+3+m_code[iCode].sd.iNumber].iNumber=InputInt();
tStart=clock();
iCode++;
break;
case OP_JUMP: //无条件跳转
iCode=m_code[iCode].sd.iNumber;
break;
case OP_JUMPC: //条件跳转
if(memory[iAddress].iNumber!=0)
iCode=m_code[iCode].sd.iNumber;
else iCode++;
iAddress--;
break;
case OP_LESSD: //实数小于
if(memory[iAddress-1].dNumber < memory[iAddress].dNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_LESSEQUALD: //实数小于等于
if(memory[iAddress-1].dNumber <= memory[iAddress].dNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_LESSEQUALI: //整数小于等于
if(memory[iAddress-1].iNumber <= memory[iAddress].iNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_LESSI: //整数小于
if(memory[iAddress-1].iNumber < memory[iAddress].iNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_LOADARRAYD: //导入实数数组
iTemp=iBase+3+m_code[iCode].sd.iNumber;//数组头位置
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -