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