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

📄 sharehead.h

📁 一个支持中文的类C语言编译器
💻 H
字号:
////////////////////////////////////////////////////////////////////////////////
//
//文件名:	ShareHead.h
//描述:	定义各类数据结构
//作者:	胡广华
//更新日期:
//
/////////////////////////////////////////////////////////////////////////////////
//#pragma once // Include this header file once per compilation unit 

#include "Mmsystem.h"

#ifndef __SHAREHEAD_H__
#define __SHAREHEAD_H__

#pragma warning(disable:4800)
#pragma warning(disable:4804)
#pragma warning(disable:4805)
#pragma warning(disable:4018)

#pragma comment(lib,"winmm")

class CPointerWord{
//implement
public:
	CPointerWord(){pFst_word=NULL;pLst_word=NULL; piFst_word=piLst_word=0;}
	~CPointerWord(){}
//member
public:
	int piFst_word;
	int piLst_word;
	PTSTR pFst_word;
	PTSTR pLst_word;
};

typedef enum{
	$ILLEGALWORD,//非法字符
	$ENDOFFILE,//文件尾
	$NOTBASEWORD,//非基本字
	$IF,	//if
	$ELSE,	//else
	$WHILE,	//while
	$SIGN,	//标识符
	$PLUS,	//+
	$MINUS,	//-
	$STAR,	//*
	$DIVIDE,//'/'
	$AND,	//&
	$OR,	//|
	$LOW,	//<
	$LARGE,	//>
	$EQU,	//=
	$NOT,	//!
	$LPAR,	//(
	$RPAR,	//)
	$LBP,	//{
	$RBP,	//}
	$QUOT,	//"
	$DOTCO,	//;
	$COMMA,	//,
	$DOT,	//.
	$FCONST,//实数常量
	$ICONST,//整型常量
	$SCONST,//字符串型常量
	$DAND,	//&&
	$DOR,	//||
	$LOEQ,	//<=
	$LAEQ,	//>=
	$DEQ,	//==
	$NEQ,	//!=

//预定义算术功能函数
	$ABS,	//abs
	$ACOS,	//acos
	$ASIN,	//asin
	$ATAN,	//atan
	$COS,	//cos
	$EXP,	//exp
	$POW,	//pow
	$SIN,	//sin
	$SQRT,	//sqrt
	$TAN,	//tan

//系统函数
	$GETBITS, //GetBits
	$OPENPICTURE,//OpenPicture 打开子画面
	$CLOSEPICTURE,//ClosePicture 关闭子画面
	$PLAYWAVEFILE,//PlayWaveFile 播放wave文件 
	$EXIT,		  //Exit 退出系统
	$LOGIN,		//Login 登陆
	$LOGOUT,	//LogOut 退出登陆
	$USERCONFIG  //UserConfig 用户设置
}WordType;//单词种别码

#define MAXCOUNT_STRING 256//变量名,函数名及字符串常量名的最大长度

typedef	union{
		char SignOrString[MAXCOUNT_STRING];
		long intconst;
		double dbconst;
	}WordValue;

//词法分析二元式结构定义
class CTwoDim{
public:

	CTwoDim(){
		WdTp=$ENDOFFILE;
		for(int i=0;i<MAXCOUNT_STRING;i++){
			WdVlue.SignOrString[i]='\000';
		}
	}

	CTwoDim(WordType wt){WdTp=wt;
		for(int i=0;i<MAXCOUNT_STRING;i++){
			WdVlue.SignOrString[i]='\000';
		}
	}

	CTwoDim(WordType wt,char* ps){
		WdTp=wt;
		for(int i=0;i<MAXCOUNT_STRING;i++){
			WdVlue.SignOrString[i]='\000';
		}
		strcpy(WdVlue.SignOrString,ps);
	}

	CTwoDim(WordType wt,double d){
		WdTp=wt;
		for(int i=0;i<MAXCOUNT_STRING;i++){
			WdVlue.SignOrString[i]='\000';
		}
		WdVlue.dbconst=d;}

	CTwoDim(WordType wt,long l){
		WdTp=wt;
		for(int i=0;i<MAXCOUNT_STRING;i++){
			WdVlue.SignOrString[i]='\000';
		}
		WdVlue.intconst=l;}
	
	~CTwoDim(){WdTp=$ENDOFFILE;
		for(int i=0;i<MAXCOUNT_STRING;i++){
			WdVlue.SignOrString[i]='\000';
		}}
	void InitTD(){WdTp=$ENDOFFILE;
		for(int i=0;i<MAXCOUNT_STRING;i++){
			WdVlue.SignOrString[i]='\000';
		}
	}

	void WordToTDSoS(CString str)
	{
		strcpy(WdVlue.SignOrString,str.GetBuffer(0));
	}
public:
	WordType WdTp;//种别码
	WordValue WdVlue;//如果是标识符,单词的值为其机内码
					//如果是字符串常量,signname用作暂存器
					/*typedef	union{
						char SignOrString[MAXCOUNT_STRING];
						long intconst;
						double dbconst;
					}WordValue;*/
};

#define SIZE_TB 31//基本字表长度

typedef enum{
	SUCCESSFUL,//成功地识别
	NOTTHISKIND,//不在开始符号集中,不属于此语法范畴
	ERRINPROCESS//规约过程中失败,发生错误
	}ReturnType;
//*	

//typedef enum{$READ, $WRITE, $RDWRT}VarRW;//读写属性
typedef enum{$INT,$REAL,$STRING,$BOOL,$INVALID}VarType;//数据类型
typedef enum{$VARIANT,$PROPERPTY}IdentType;//左值变量类型:变量?属性?
class COpData{
//implement:
public:
	COpData()
	{
		VarName.Empty();
		VarRw=$RDWRT;
		VarTp=$INT;
		for(int i=0;i<MAXCOUNT_STRING;i++){
			VarVlue.SignOrString[i]='\000';
		}
	}

	COpData(char* name,VarType vT,int id)//专为属性表量身打造
	{
		VarName.Empty();
		VarName=name;//变量名(属性名)
		VarRw=$RDWRT;
		VarTp=vT;
		VarVlue.intconst=id;//值用来存放属性id
	}

	COpData(VarType vT)
	{
		VarTp=vT;
		VarName.Empty();
		VarRw=$RDWRT;
		for(int i=0;i<MAXCOUNT_STRING;i++){
			VarVlue.SignOrString[i]='\000';
		}
	}

	COpData(int i)//int
	{
		VarName.Empty();
		VarRw=$RDWRT;
		VarTp=$INT;
		VarVlue.intconst=i;
	}

	COpData(long l)//long
	{
		VarName.Empty();
		VarRw=$RDWRT;
		VarTp=$INT;
		VarVlue.intconst=l;
	}

	COpData(double d)//doulbe
	{
		VarName.Empty();
		VarRw=$RDWRT;
		VarTp=$REAL;
		VarVlue.dbconst=d;
	}

	COpData(float f)//float
	{
		VarName.Empty();
		VarRw=$RDWRT;
		VarTp=$REAL;
		VarVlue.dbconst=f;
	}

	COpData(char* str)//string
	{
		VarName.Empty();
		VarRw=$RDWRT;
		VarTp=$STRING;
		strcpy(VarVlue.SignOrString,str);
	}

	COpData(bool b)//bool
	{
		VarName.Empty();
		VarRw=$RDWRT;
		VarTp=$BOOL;
		VarVlue.intconst=b;
	}

	~COpData(){}

	//运算符重载
	COpData& operator =(const COpData&);
	friend COpData operator +(const COpData &opd1,const COpData &opd2);
	friend COpData operator -(const COpData &opd1,const COpData &opd2);
	friend COpData operator *(const COpData &opd1,const COpData &opd2);	
	friend COpData operator /(const COpData &opd1,const COpData &opd2);	

	friend BOOL operator ==(const COpData &opd1,const COpData &opd2);//1-true,0-false,-1-invalid
	friend BOOL operator !=(const COpData &opd1,const COpData &opd2);//1-true,0-false,-1-invalid
	friend BOOL operator <(const COpData &opd1,const COpData &opd2);//1-true,0-false,-1-invalid	
	friend BOOL operator <=(const COpData &opd1,const COpData &opd2);//1-true,0-false,-1-invalid	
	friend BOOL operator >(const COpData &opd1,const COpData &opd2);//1-true,0-false,-1-invalid
	friend BOOL operator >=(const COpData &opd1,const COpData &opd2);//1-true,0-false,-1-invalid


//member:
public:
	CString VarName;//操作数名
//	VarRW VarRw;//操作数读写属性
	WordValue VarVlue;//操作数值
	VarType VarTp;//操作数类型(typedef enum{$INT,$REAL,$STRING,$BOOL,$INVALID}VarType;//数据类型)
};
// 
#define  ARG_COUNT  30//最大参数个数
class CArgInfo{
public:
	CArgInfo(){nCount=0;}

	CArgInfo(int n,COpData opd,...)//避免与下面的构造函数混淆,且支持变长度函数参数。最后一个参数必须为“无效”型
	{
		nCount=n;
		int i=0;
		COpData opdThis=opd;//temp
		va_list marker;		
		va_start( marker, opd );     /* Initialize variable arguments. */
		while (opdThis.VarTp!=$INVALID) {
			arg[i].VarTp=opdThis.VarTp;
			i++;
			opdThis=va_arg(marker,COpData);			
		}
		va_end(marker);
	}
	
	CArgInfo(int n,COpData* opd)
	{
		nCount=n;
		for(int i=0;i<ARG_COUNT;i++){
			arg[i].VarTp=opd[i].VarTp;
		}
	}
	friend bool operator ==(const CArgInfo& argInfo1,const CArgInfo& argInfo2);//若参数类型严格匹配,返回真
public:
	COpData arg[ARG_COUNT];
	int nCount;//参数个数
};//存放参数信息
	
//#define SIZE_TB_FUNC 11//预定义系统算术功能函数个数为10,加上系统函数
//已作修订,SIZE_TB_FUNC被定义成一个整型常量,添加新函数时会自动更新
class CFuncInfo{
public:
	CFuncInfo(CTwoDim td,CArgInfo arginf)
	{
		TDim.WdTp=td.WdTp;//函数码
		strcpy(TDim.WdVlue.SignOrString,td.WdVlue.SignOrString);//函数名
		argInfo.nCount=arginf.nCount;//参数个数
		for(int i=0;i<arginf.nCount;i++){
			argInfo.arg[i].VarTp=arginf.arg[i].VarTp;//参数类型
		}
	};
	CFuncInfo(){};

public:
	CTwoDim TDim;//函数名,函数枚举型别名(后者便于程序比较函数名)
	CArgInfo argInfo;//函数参数信息:参数个数,参数类型
};

//全局函数——获取操作数结果
//////////////////////////////////////////////////////////////
#ifndef _GETOPD_
#define _GETOPD_
template <class T>
bool GetOpd	(COpData &opd,T& Res)
{
	switch(opd.VarTp)
	{
	case $INT:
	case $BOOL:
		Res=opd.VarVlue.intconst;
		return true;
	case $REAL:
		Res=opd.VarVlue.dbconst;
		return true;
	case $STRING:
		strcpy((char*)&Res ,opd.VarVlue.SignOrString);
		return true;
	default:
		return false;
	}
}

#endif//_GETOPD_
/////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////
#ifndef _GETBITS__
#define _GETBITS__

extern  int GetBits(long Data/*操作数*/,int end=0/*终止位*/,int beg=-1/*起始位*/);

#endif//_GETBITS__
/////////////////////////////////////////////////////////////////
//*/
#endif//__SHAREHEAD_H__

⌨️ 快捷键说明

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