Simplify tests for ParseExp.cpp
This commit is contained in:
parent
8b0f386121
commit
fe302d2ef5
190
src/ParseExp.cpp
190
src/ParseExp.cpp
|
@ -280,21 +280,21 @@ double ParseExp::EvaluateExpr(struct parse_opt* root, bool del)
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case ADD:
|
case ADD:
|
||||||
P(std::cout << l << " + " << r << std::endl);
|
P(std::cout << "\t" << l << " + " << r << std::endl);
|
||||||
return l+r;
|
return l+r;
|
||||||
case SUB:
|
case SUB:
|
||||||
P(std::cout << l << " - " << r << std::endl);
|
P(std::cout << "\t" << l << " - " << r << std::endl);
|
||||||
return l-r;
|
return l-r;
|
||||||
case MUL:
|
case MUL:
|
||||||
P(std::cout << l << " * " << r << std::endl);
|
P(std::cout << "\t" << l << " * " << r << std::endl);
|
||||||
return l*r;
|
return l*r;
|
||||||
case DIV:
|
case DIV:
|
||||||
P(std::cout << l << " / " << r << std::endl);
|
P(std::cout << "\t" << l << " / " << r << std::endl);
|
||||||
return l/r;
|
return l/r;
|
||||||
// case MOD:
|
// case MOD:
|
||||||
// return EvaluateExpr(root->l) % EvaluateExpr(root->r);
|
// return EvaluateExpr(root->l) % EvaluateExpr(root->r);
|
||||||
case EXP:
|
case EXP:
|
||||||
P(std::cout << l << " ^ " << r << std::endl);
|
P(std::cout << "\t" << l << " ^ " << r << std::endl);
|
||||||
res = 1;
|
res = 1;
|
||||||
while (r--)
|
while (r--)
|
||||||
res *= l;
|
res *= l;
|
||||||
|
@ -309,147 +309,55 @@ double ParseExp::EvaluateExpr(struct parse_opt* root, bool del)
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
using namespace ParseExp;
|
using namespace ParseExp;
|
||||||
|
|
||||||
|
static char* e1;
|
||||||
|
static inline int test(char* expr, double target_result)
|
||||||
|
{
|
||||||
|
struct parse_opt root, *r;
|
||||||
|
char* e = e1;
|
||||||
|
double res;
|
||||||
|
|
||||||
|
memset(e1, 0, 100);
|
||||||
|
strcpy(e1, expr);
|
||||||
|
memset(&root, 0, sizeof(root));
|
||||||
|
r = &root;
|
||||||
|
|
||||||
|
ParseExp::ParseExp(&e1, r, false);
|
||||||
|
res = EvaluateExpr(&root, true);
|
||||||
|
|
||||||
|
res *= 100;
|
||||||
|
res = ((long)res)/100.0;
|
||||||
|
|
||||||
|
if (res == target_result)
|
||||||
|
std::cout << e << " = " << res << "\n";
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << e << "(exp) " << target_result << " != " << "(res) " << res << "\n";
|
||||||
|
throw "Invalid result !";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
char* e1 = new char[100] ;
|
e1 = new char[100] ;
|
||||||
char* e = e1;
|
|
||||||
struct parse_opt root, *r;
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
memset(&root, 0, sizeof(root));
|
test("4*3", 12);
|
||||||
r = &root;
|
test("4*3+5", 17);
|
||||||
strcpy(e1, "4*3");
|
test("3+3+3", 9);
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
test("3+3+3+3", 12);
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
test("4+3*5", 19);
|
||||||
|
test("-4+3*5/2", 3.5);
|
||||||
e1 = e;
|
test("5+-4", 1);
|
||||||
memset(e1, 0, 100);
|
test("5--4", 9);
|
||||||
strcpy(e1, "4*3+5");
|
test("4*(3+2)", 20);
|
||||||
memset(&root, 0, sizeof(root));
|
test("(3+2)*4", 20);
|
||||||
r = &root;
|
test("4*(3+2)+5", 25);
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
test("5+(3+2)*4", 25);
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
test("3+(3+(3+3))", 12);
|
||||||
|
test("3+(3+(3+(3+3)))*5", 63);
|
||||||
e1 = e;
|
test("5+(3/(6+8--5)*9)*4", 10.68);
|
||||||
memset(e1, 0, 100);
|
test("78.83-(.39+6.46+3.54+.23+1.57)", 66.64);
|
||||||
strcpy(e1, "3+3+3");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "3+3+3+3");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "4+3*5");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "-4+3*5/2");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "5+-4");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "5--4");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "4*(3+2)");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "(3+2)*4");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "4*(3+2)+5");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "5+(3+2)*4");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "3+(3+(3+3))");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "3+(3+(3+(3+3)))*5");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "5+(3/(6+8--5)*9)*4");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "5+(3*(6+8--5)/9)*4");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
|
|
||||||
e1 = e;
|
|
||||||
memset(e1, 0, 100);
|
|
||||||
strcpy(e1, "78.83-(.39+6.46+3.54+.23+1.57)");
|
|
||||||
memset(&root, 0, sizeof(root));
|
|
||||||
r = &root;
|
|
||||||
ParseExp::ParseExp(&e1, r, false);
|
|
||||||
std::cout << e << " = " << EvaluateExpr(&root, true) << "\n";
|
|
||||||
}
|
}
|
||||||
catch (int e)
|
catch (int e)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user