📄 sharehead.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 + -