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

📄 expression.h

📁 PC网络游戏的编程
💻 H
字号:
// 嵌入式表达式代码
// 作者: Janhail Luo
// 最后整理: 2003-03-03
//////////////////////////////////////////////////////////////////////
#ifndef _EXPRESSION_H_
#define _EXPRESSION_H_

#include <stack>
#include <string>
using namespace std;
#include "ParseStr.h"

#define EXPR_MAX_OPERATE    13

// + - * / ( )
class CExpression
{
public:
	CExpression();
	virtual ~CExpression();

public:

    // 功能: 计算表达式
    // 参数: [IN]  szExpStr 表达式字符串
    //       [OUT] var 返回表达式的计算值
    // 返回: true 成功计算
    //       flase 表达式错误,具体错误信息请到用GetError()
    // 说明: 他遇到函数调用或者符号是会相应调用以下两个函数
    bool Computer(const char *szExpStr, double *var);
    // 功能: 设置错误信息到错误纪录中
    // 参数: [IN] 格式化的字符串
    // 返回: 没有返回值
    void SetError(const char* errMsg, ...);
    // 功能: 取得最后一次的错误信息
    // 参数: 没有参数
    // 返回: 最后一次的错误信息的字符串
    const char* GetError(void);

    // 功能: 函数调用
    // 参数: [IN]  szCallName 函数名字
    //       [IN]  iParmCnt 参数的个数
    //       [IN]  pParms 指向参数表的一个指针(数组)
    //       [OUT] var 返回函数调用的计算值
    // 返回: true  计算成功
    //       false 计算失败
    virtual bool DoCall(const char *szCallName, const int iParmCnt, const double *pParms, double *var);

private:
    int     inOperate(char o);                      // 是否是操作符
    int     Precede(char o1, char o2);              // 比较操作优先级别
    double  Operate(double n1, double n2, char o);  // 操作
    bool    inRange(char c);                        // 是否是Symbol允许的字符
    void    SaveScene();                            // 保存现场
    void    LoadScene();                            // 取得现场

    char*   _DoCall(char *szCallName, char *szExpr);
    char*   _DoComma(char *szExpr);
    char*   _DoExpr(char *szExpr);
    bool    _GetNumber(char* szExp, double *var);
    bool    _IsSingle(char opr);
    void    _Clear();
    static bool DefDoCall(CExpression *pObj, const char *szCallName, const int iParmCnt, const double *pParms, double *var);

private:
    stack <double>  _NumStack;                  // 当前表达式数值堆栈
    stack <char>    _OprStack;                  // 当前表达式操作堆栈
    stack <double>  _ParmStack;                 // 函数调用参数堆栈
    stack <string>  _CallStack;                 // 函数调用堆栈
    stack <int>     _CallParmCntStack;          // 函数调用参数个数堆栈
    stack <int>     _SceneStack;                // 保存现场用堆栈(分别指出表示式堆栈数和操作堆栈数)

    stack <double>  _NumTotalStack;             // 表达式总的数值堆栈
    stack <char>    _OprTotalStack;             // 表达式总的操作堆栈

    char    _Symbol[EXPR_MAX_SYMBOL+1];         // 当前操作符号
    static char _Operate[EXPR_MAX_OPERATE];     // 所有的基本操作符
    static int  _Precede[EXPR_MAX_OPERATE][EXPR_MAX_OPERATE];   // 基本操作符的优先级
protected:
    bool    _bError;                            // 是否有错误
    char    _szErrorLog[100];                   // 错误信息
};

#endif // _EXPRESSION_H_

⌨️ 快捷键说明

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