#include
#include
#include
#include
using namespace std;
enum types { DELIMITER = 1, VARIABLE, NUMBER};//定义枚举类型把DELIMITER初试化为1后面
//的相应的是前面值+1
class parser
{
char *exp_ptr; // 定义一个指向表达式的指针
char token[80]; // 存储表达式中的字符变量
char tok_type; // 存储具体是什么类型
void eval_exp2(double &result);
void eval_exp3(double &result);
void eval_exp4(double &result);
void eval_exp5(double &result);
void eval_exp6(double &result);
void atom(double &result);
void get_token();
void serror(int error);
int isdelim(char c);
public:
parser();
double eval_exp(char *exp);
};
parser::parser()
{
cout<
cout<
cout<
cout << "\t在运算过程中,输入字母N或n 回车,结束程序运行\n\n";
cout<
exp_ptr = NULL;//把exp_ptr的指针初始化为空
}
// 方法eval_exp的具体实现过程
double parser::eval_exp(char *exp)
{
double result;
exp_ptr = exp;//把传递过来的参数exp赋给exp_ptr
get_token();
if(!*token)
{
serror(2); //输出没有任何表达式的错误信息
return 0.0;
}
eval_exp2(result);
if(*token) serror(0); // last token must be null
return result;
}
// 两个变量字符是加或者减操作
void parser::eval_exp2(double &result)
{
register char op;
double temp;
eval_exp3(result);
while((op = *token) == '+' || op == '-')
{
get_token();
eval_exp3(temp);
switch(op)
{
case '-':
{
result = result - temp;
break;
}
case '+':
{
result = result + temp;
break;
}
}
}
}
// 两个变量是乘或者除操作 或者是取余
void parser::eval_exp3(double &result)
{
register char op;
double temp;
eval_exp4(result);
while((op = *token) == '*' || op == '/' || op == '%')
{
get_token();
eval_exp4(temp);
switch(op)
{
case '*':
result = result * temp;
break;
case '/':
result = result / temp;
break;
case '%':
result = (int) result % (int) temp;
break;
}
}
}
// 进行^运算
void parser::eval_exp4(double &result)
{
double temp, ex;
register int t;
eval_exp5(result);
if(*token== '^')
{
get_token();
eval_exp4(temp);