//
Expression.h
////////////////////////////////////////////
#pragma
once
#include
<string>
/*
Expression类包含了与表达式有关的功能,
1.中缀转后缀
2.表达式检查
出错处理
错误种类
1.非法字符
x+2
2.括号不匹配
2+(3-9
3.错误表达 2( 2#2
**
/)
3.表达式化简
4.表达式计算
出错处理 //未实现
错误种类
1.数据溢出
123456789012
2.除异常
*/
/*
文法:
E
::= iS | (E) //首部或(1+2)
E
::= ES //后部+3*4
S
::= +E
S
::= -E
S
::= *E
S
::= /E
S
::= '\0'
*/
/*
去括号:
1+(1)+12
+2
(
1
1-(1*2)+1
*/
class
Expression
{
public:
struct
Error
{
int
value;
int
position;
};
//types of
errors
enum ErrType
{
//errors
when analysing
CORRECT_EXP,
//none error.
ILLEGAL_CHAR,
//illegal
character.
UNMATCHED_BRACKET,
//unmatched
bracket.
ILLEGAL_COMB,
//illegal
combination.
UNEXPECTED_END, //unexpected end
of expression.
NONE_EXP,
//none expression
exist.
//errors
when executing
OVERFLOW,
//data overflow.
DIV_BY_ZERO //divided by
zero.
};
protected:
//types of
character
enum CharType
{
OPT,
//operator
OPD,
//operand
ILLEGAL,
//illegal
character
OPEN, //opening
bracket
CLOSE, //closing
bracket
EOS //exiting
string
};
//----------------------------------------------------------------
public:
static
const char*
GetErrMsg(int value);
//----------------------------------------------------------------
public:
Expression(const
std::string& exp);
const
std::string&
ExpStr(); //返回表达式
bool Check(Error* pErr =
NULL); //语法检查
bool Predigest(); //简化表达式
double ExpValue(); //获得表达式的值
int OptCmp(char left,char right); //运算符优先级比较
double Calc(double left,char opt,double right);
std::string
ToSuffix(); //获得等价后缀表达式
//----------------------------------------------------------------
protected:
void Format();
//过滤空格
ErrType
CheckMain(int& pos,int&
bracket);
//pos游标,bracket括号(+1,)-1
ErrType
CheckSub(int& pos,int&
bracket);
int DataSize(int&
pos); //获得pos开始的数字串长度
int IndexOpt(char
opt); //获得运算符索引
CharType
GetType(int& pos); //获得pos开始的串类别
//----------------------------------------------------------------
private:
std::string
szExp;
bool bValid;
};