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

📄 semantics.c

📁 编译原理实验
💻 C
字号:
// -------------------------- semantics.c ------------------------------
#include "semantics.h"

extern double
		Parameter,					// 参数T的存储空间
		start, end,	step,			// 循环绘图语句的起点、终点、步长
		Origin_x, Origin_y,			// 横、纵平移距离
		Scale_x, Scale_y, 			// 横、纵比例因子
		Rot_angle;					// 旋转角度
extern unsigned int LineNo;

void DrawPixel(unsigned long x, unsigned long y);	// 绘制一个点
void DrawLoop(double Start,							// 绘制图形
			  double End,
			  double Step,
			  struct ExprNode * HorPtr,
			  struct ExprNode * VerPtr);
double GetExprValue(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)
{	double x, y;
	for(Parameter = Start; Parameter <= End; Parameter += Step)
	{	CalcCoord(HorPtr, VerPtr, &x, &y);
		DrawPixel((unsigned long)x, (unsigned long)y);
	}
}

// -------------------------- 绘制一个点
void DrawPixel(unsigned long x, unsigned long y)
{	
	SetPixel(hDC, x, y, red);
	SetPixel(hDC, x+1, y, red);
	SetPixel(hDC, x, y+1, red);
	SetPixel(hDC, x+1, y+1, red);
}

// -------------------------- 计算表达式的值
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 ;
	}
}

⌨️ 快捷键说明

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