sharehead.cpp

来自「一个支持中文的类C语言编译器」· C++ 代码 · 共 856 行 · 第 1/2 页

CPP
856
字号
#include "stdafx.h"
#include "ShareHead.h"

 COpData& COpData::operator =(const COpData &opd)
{
	switch(this->VarTp)
	{
	case $INT:
		switch(opd.VarTp)
		{
		case $INT:
			this->VarVlue.intconst=opd.VarVlue.intconst;
			this->VarTp=$INT;
			break;
		case $REAL:
			this->VarVlue.dbconst=opd.VarVlue.dbconst;
			this->VarTp=$REAL;
			break;
		case $BOOL:
			this->VarVlue.intconst=opd.VarVlue.intconst;
			this->VarTp=$INT;
			break;
		case $STRING:
			this->VarTp=$INVALID;
			break;
		case $INVALID:
		default:
			this->VarTp=$INVALID;
			break;
		}
		break;
	case $REAL:
		switch(opd.VarTp)
		{
		case $INT:
			this->VarVlue.dbconst=opd.VarVlue.intconst;
			this->VarTp=$REAL;
			break;
		case $REAL:
			this->VarVlue.dbconst=opd.VarVlue.dbconst;
			this->VarTp=$REAL;
			break;
		case $BOOL:
			this->VarVlue.dbconst=opd.VarVlue.intconst;
			this->VarTp=$INT;
			break;
		case $STRING:
			this->VarTp=$INVALID;
			break;
		case $INVALID:
		default:
			this->VarTp=$INVALID;
			break;
		}
		break;
	case $BOOL:
		switch(opd.VarTp)
		{
		case $INT:
			this->VarVlue.intconst=opd.VarVlue.intconst;
			this->VarTp=$BOOL;
			break;
		case $REAL:
			if(opd.VarVlue.dbconst){
				this->VarVlue.intconst=1;
			}
			else{
				this->VarVlue.intconst=0;
			}
			this->VarTp=$BOOL;
			break;
		case $BOOL:
			this->VarVlue.intconst=opd.VarVlue.intconst;
			this->VarTp=$BOOL;
			break;
		case $STRING:
			this->VarTp=$INVALID;
			break;
		case $INVALID:
		default:
			this->VarTp=$INVALID;
			break;
		}
		break;
	case $STRING:
		switch(opd.VarTp)
		{
		case $STRING:
			this->VarTp=$STRING;
			strcpy(this->VarVlue.SignOrString,opd.VarVlue.SignOrString);
			break;
		case $INT:
		case $REAL:
		case $BOOL:
		case $INVALID:
		default:
			this->VarTp=$INVALID;
			break;
		}
		break;
	default:
		this->VarTp=$INVALID;
	}
	return *this;
}
//----------------------------------------"+"-----------------------------------------------------------
  COpData operator +(const COpData &opd1,const COpData &opd2)
{
	COpData result;
	switch(opd1.VarTp)
	{
	case $INT:
		switch(opd2.VarTp)
		{
		case $INT:
			return COpData(opd1.VarVlue.intconst+opd2.VarVlue.intconst);
		case $REAL:
			return COpData((double)(opd1.VarVlue.intconst+opd2.VarVlue.dbconst));
		case $BOOL:
			return COpData((int)(opd1.VarVlue.intconst+(bool)opd2.VarVlue.intconst));
		case $STRING:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	case $REAL:
		switch(opd2.VarTp)
		{
		case $INT:
			return COpData((double)(opd1.VarVlue.dbconst+opd2.VarVlue.intconst));
		case $REAL:
			return COpData((double)(opd1.VarVlue.dbconst+opd2.VarVlue.dbconst));
		case $BOOL:
			return COpData((double)(opd1.VarVlue.dbconst+(bool)opd2.VarVlue.intconst));
		case $STRING:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	case $BOOL:
		switch(opd2.VarTp)
		{
		case $INT:
			return COpData((int)((bool)opd1.VarVlue.intconst+opd2.VarVlue.intconst));
		case $REAL:
			return COpData((double)((bool)opd1.VarVlue.intconst+opd2.VarVlue.dbconst));
		case $BOOL:
			return COpData((bool)((bool)opd1.VarVlue.intconst+(bool)opd2.VarVlue.intconst));
		case $STRING:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	case $STRING:
		switch(opd2.VarTp)
		{
		case $STRING:
			strcpy(result.VarVlue.SignOrString,opd1.VarVlue.SignOrString);
			strcpy(result.VarVlue.SignOrString,opd2.VarVlue.SignOrString);
			return result;
		case $INT:
		case $REAL:
		case $BOOL:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	default:
			result.VarTp=$INVALID;
			return result;
	}
}
//---------------------------"-"------------------------------------------------------

  COpData operator -(const COpData &opd1,const COpData &opd2)
{
	COpData result;
	switch(opd1.VarTp)
	{
	case $INT:
		switch(opd2.VarTp)
		{
		case $INT:
			return COpData(opd1.VarVlue.intconst-opd2.VarVlue.intconst);
		case $REAL:
			return COpData((double)(opd1.VarVlue.intconst-opd2.VarVlue.dbconst));
		case $BOOL:
			return COpData((int)(opd1.VarVlue.intconst-(bool)opd2.VarVlue.intconst));
		case $STRING:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	case $REAL:
		switch(opd2.VarTp)
		{
		case $INT:
			return COpData((double)(opd1.VarVlue.dbconst-opd2.VarVlue.intconst));
		case $REAL:
			return COpData((double)(opd1.VarVlue.dbconst-opd2.VarVlue.dbconst));
		case $BOOL:
			return COpData((double)(opd1.VarVlue.dbconst-(bool)opd2.VarVlue.intconst));
		case $STRING:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	case $BOOL:
		switch(opd2.VarTp)
		{
		case $INT:
			return COpData((int)((bool)opd1.VarVlue.intconst-opd2.VarVlue.intconst));
		case $REAL:
			return COpData((double)((bool)opd1.VarVlue.intconst-opd2.VarVlue.dbconst));
		case $BOOL:
			return COpData((bool)((bool)opd1.VarVlue.intconst-(bool)opd2.VarVlue.intconst));
		case $STRING:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	case $STRING:
	default:
			result.VarTp=$INVALID;
			return result;
	}
}
//--------------------------------"*"--------------------------------------------------------------
  COpData operator *(const COpData &opd1,const COpData &opd2)
{
	COpData result;
	switch(opd1.VarTp)
	{
	case $INT:
		switch(opd2.VarTp)
		{
		case $INT:
			return COpData(opd1.VarVlue.intconst*opd2.VarVlue.intconst);
		case $REAL:
			return COpData((double)(opd1.VarVlue.intconst*opd2.VarVlue.dbconst));
		case $BOOL:
			return COpData((int)(opd1.VarVlue.intconst*(bool)opd2.VarVlue.intconst));
		case $STRING:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	case $REAL:
		switch(opd2.VarTp)
		{
		case $INT:
			return COpData((double)(opd1.VarVlue.dbconst*opd2.VarVlue.intconst));
		case $REAL:
			return COpData((double)(opd1.VarVlue.dbconst*opd2.VarVlue.dbconst));
		case $BOOL:
			return COpData((double)(opd1.VarVlue.dbconst*(bool)opd2.VarVlue.intconst));
		case $STRING:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	case $BOOL:
		switch(opd2.VarTp)
		{
		case $INT:
			return COpData((int)((bool)opd1.VarVlue.intconst*opd2.VarVlue.intconst));
		case $REAL:
			return COpData((double)((bool)opd1.VarVlue.intconst*opd2.VarVlue.dbconst));
		case $BOOL:
			return COpData((bool)((bool)opd1.VarVlue.intconst*(bool)opd2.VarVlue.intconst));
		case $STRING:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	case $STRING:
	default:
			result.VarTp=$INVALID;
			return result;
	}
}
//-------------------------"/"-------------------------------------------------------------------
  COpData operator /(const COpData &opd1,const COpData &opd2)
{
	COpData result;
	switch(opd1.VarTp)
	{
	case $INT:
		switch(opd2.VarTp)
		{
		case $INT:
			return COpData(opd1.VarVlue.intconst/opd2.VarVlue.intconst);
		case $REAL:
			return COpData((double)(opd1.VarVlue.intconst/opd2.VarVlue.dbconst));
		case $BOOL:
			return COpData((int)(opd1.VarVlue.intconst/(bool)opd2.VarVlue.intconst));
		case $STRING:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	case $REAL:
		switch(opd2.VarTp)
		{
		case $INT:
			return COpData((double)(opd1.VarVlue.dbconst/opd2.VarVlue.intconst));
		case $REAL:
			return COpData((double)(opd1.VarVlue.dbconst/opd2.VarVlue.dbconst));
		case $BOOL:
			return COpData((double)(opd1.VarVlue.dbconst/(bool)opd2.VarVlue.intconst));
		case $STRING:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	case $BOOL:
		switch(opd2.VarTp)
		{
		case $INT:
			return COpData((int)((bool)opd1.VarVlue.intconst/opd2.VarVlue.intconst));
		case $REAL:
			return COpData((double)((bool)opd1.VarVlue.intconst/opd2.VarVlue.dbconst));
		case $BOOL:
			return COpData((bool)((bool)opd1.VarVlue.intconst/(bool)opd2.VarVlue.intconst));
		case $STRING:
		case $INVALID:
		default:
			result.VarTp=$INVALID;
			return result;
		}
		break;
	case $STRING:
	default:
			result.VarTp=$INVALID;
			return result;
	}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

//------------------------------------------"=="--------------------------------------------------------------
 BOOL operator ==(const COpData &opd1,const COpData &opd2)
{
	switch(opd1.VarTp)
	{
	case $INT:
		switch(opd2.VarTp)
		{
		case $INT:
			return(bool)(opd1.VarVlue.intconst==opd2.VarVlue.intconst);
		case $REAL:
			return(bool)(opd1.VarVlue.intconst==opd2.VarVlue.dbconst);
		case $BOOL:
			return(bool)(opd1.VarVlue.intconst==(bool)opd2.VarVlue.intconst);
		case $STRING:
		case $INVALID:
			return -1;
		default:
			return-1;
		}
		break;
	case $REAL:
		switch(opd2.VarTp)
		{
		case $INT:
			return(bool)(opd1.VarVlue.dbconst==opd2.VarVlue.intconst);
		case $REAL:
			return(bool)(opd1.VarVlue.dbconst==opd2.VarVlue.dbconst);
		case $BOOL:
			return(bool)(opd1.VarVlue.dbconst==(bool)opd2.VarVlue.intconst);
		case $STRING:
		case $INVALID:
			return -1;
		default:
			return-1;
		}
		break;
	case $BOOL:
		switch(opd2.VarTp)
		{
		case $INT:
			return(bool)((bool)opd1.VarVlue.intconst==opd2.VarVlue.intconst);
		case $REAL:
			return(bool)((bool)opd1.VarVlue.intconst==opd2.VarVlue.dbconst);
		case $BOOL:
			return(bool)((bool)opd1.VarVlue.intconst==(bool)opd2.VarVlue.intconst);
		case $STRING:
		case $INVALID:
			return -1;
		default:
			return-1;
		}
		break;
	case $STRING:
		switch(opd2.VarTp)
		{
		case $STRING:
			return (bool)!strcmp(opd1.VarVlue.SignOrString,opd2.VarVlue.SignOrString);
		case $INT:
		case $REAL:
		case $BOOL:
		case $INVALID:
			return -1;
		default:

⌨️ 快捷键说明

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