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

📄 fc-interpret.cpp

📁 我开发了一个基于MFC的语言翻译软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -