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

📄 semantic.cpp

📁 为简单的函数绘图语言编写一个解释器语法制导部分 语法制导注意:必须严格按照下面步骤调试程序
💻 CPP
字号:
//----------------------------semantic.cpp------------------------------
#include "semantics.h"

extern double 
	Parameter,
	Origin_x,Origin_y,
	Scale_x,Scale_y,
	Rot_angle;
double  GetExprValue(struct ExprNode *root);
void	DrawPixel(unsigned long x,unsigned long y);
void	DrawLoop(double Start,
				 double End,
				 double Step,
				 struct ExprNode * HorPtr,
				 struct ExprNode * VerPtr);
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;
}

void DrawLoop(double Start,double End,double Step,
			  struct ExprNode * HorPtr,struct ExprNode * VerPtr)
{
	extern double Parameter;
	double x,y;
	for(Parameter = Start;Parameter<=End;Parameter +=Step)
	{
		CalcCoord(HorPtr,VerPtr,x,y);
		DrawPixel((unsigned long)x,(unsigned long)y);
	}
}

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);
}

void DrawPixel(unsigned long x,unsigned long y)
{
#ifdef _VC_COMPILER
	SetPixel(hDC,x,y,red);
#endif;

}

⌨️ 快捷键说明

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