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

📄 semantic.cpp

📁 一个采用面向对象实现编译解释器,自己验证过绝对能用.
💻 CPP
字号:
#include "semantics.h"

extern double 
       Parameter,
       Origin_x,Origin_y,
	   Scale_x,Scale_y,
	   Rot_angle;
	   
double GetExprValue(struct ExprNode *root);
void DelExprTree(struct ExprNode *root);

static void Errmsg(char *string);
static void CalcCoord(struct ExprNode *Hor_Exp,
					  struct ExprNode *Ver_Exp,
					  double &Hor_x,
					  double &Ver_y);

//..........出错处理
void Errmsg(char *string)
{
	exit(1);
}

//...........计算被绘制的点的坐标
static void CalcCoord(
					  struct ExprNode *Hor_Exp,
					  struct ExprNode *Ver_Exp,
                      double &Hor_x,
					  double &Ver_y)
{
	double HorCord,VerCord,Hor_tmp;
	HorCord = GetExprValue(Hor_Exp);
	VerCord = GetExprValue(Ver_Exp);

	HorCord *= Scale_x;
	VerCord *= Scale_y;

	Hor_tmp = HorCord *cos(Rot_angle)+VerCord *sin(Rot_angle);
	VerCord = VerCord *cos(Rot_angle)-HorCord*sin(Rot_angle);
	HorCord = Hor_tmp;

	HorCord += Origin_x;
	VerCord += Origin_y;

	Hor_x = HorCord;
	Ver_y = VerCord;
}

//..........计算表达式的值
double GetExprValue(struct ExprNode *root)
{
	if(root==NULL)
		return 0.0;
	switch(root->OpCode)
	{
	case PLUS:
		return GetExprValue(root->Content.CaseOperator.Left)+
			GetExprValue(root->Content.CaseOperator.Right);
	case MINUS:
		return GetExprValue(root->Content.CaseOperator.Left)-
			GetExprValue(root->Content.CaseOperator.Right);
	case MUL:
		return GetExprValue(root->Content.CaseOperator.Left)*
			GetExprValue(root->Content.CaseOperator.Right);
	case DIV:
		return GetExprValue(root->Content.CaseOperator.Left)/
			GetExprValue(root->Content.CaseOperator.Right);
    case POWER:
		return pow(GetExprValue(root->Content.CaseOperator.Left),
			GetExprValue(root->Content.CaseOperator.Right));
	case FUNC:
		return (*root->Content.CaseFunc.MathFuncPtr)
			(GetExprValue(root->Content.CaseFunc.Child));
	case CONST_ID:
		return root->Content.CaseConst;
	case T:
		return *(root->Content.CaseParmPtr);
	default :
		return 0.0;
	}
}


//...........删除一棵树
void DelExprTree(struct ExprNode *root)
{
	if(root==NULL)
		return ;
	switch(root->OpCode)
	{
	case PLUS:
	case MINUS:
	case MUL:
	case DIV:
	case POWER:
		DelExprTree(root->Content.CaseOperator.Left);
		DelExprTree(root->Content.CaseOperator.Right);
		break;
	case FUNC:
		DelExprTree(root->Content.CaseFunc.Child);
		break;
	default:
		break;
	}
	delete(root);
}


#ifdef _BC_COMPILER
int InGraphMode=0;
int InitGraph(void)
{
	int gd=DETECT,gm;
	if(InGraphMode)
		return 0;
	registerbgidriver(EGAVGA_driver);
	initgraph(&gd,&gm," ");
	setcolor(-1);
	InGraphMode=1;
	return 1;
}


void CloseGraph(void)
{
	if(!InGraphMode)
		return;
	getch();
	closegraph();
	InGraphMode=0;
}
#endif







⌨️ 快捷键说明

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