// evaluation routines #include #pragma hdrstop #include #include #include "eval.h" enum {TERM=-2,NONE=-1,LOR,LAND,REL,EQU,ADDI,MULT,UOP}; enum {BRAK=-1,ADD,SUB,MUL,DIV,LE,LT,GE,GT,EQ,NE,SIN,COS,ATN,ACS,ASN,SQRT,AND,OR,UPL,UMN,MOD}; EvalParse::uOps EvalParse::UnaryOps[]= { {"cos",COS,UOP}, {"sin",SIN,UOP}, {"atan",ATN,UOP}, {"acos",ACS,UOP}, {"asin",ASN,UOP}, {"sqrt",SQRT,UOP}, {"+",UPL,UOP}, {"-",UMN,UOP}, {"(",BRAK,NONE}, }; EvalParse::bOps EvalParse::BinaryOps[]= { {"+",1,ADD,ADDI}, {"-",1,SUB,ADDI}, {"*",1,MUL,MULT}, {"/",1,DIV,MULT}, {"=",1,EQ,EQU}, {"<=",2,LE,REL}, // put before < {"<>",2,NE,EQU}, // put before < {"<",1,LT,REL}, {">=",2,GE,REL}, // put before > {">",1,GT,REL}, {")",1,BRAK,NONE}, {",",1,BRAK,TERM}, {"and",3,AND,LAND}, {"or",2,OR,LOR}, {"mod",3,MOD,ADDI} }; BOOL EvalParse::UnaryOp(int &Op,int &Prec) { for (int i=0;iRightTerm);break; case GE:LeftTerm=(LeftTerm>=RightTerm);break; case AND:LeftTerm=((int) LeftTerm & (int) RightTerm);break; case OR :LeftTerm=((int) LeftTerm | (int) RightTerm);break; case UPL:LeftTerm=RightTerm;break; case UMN:LeftTerm=-RightTerm;break; case MOD:LeftTerm=((int) LeftTerm % (int) RightTerm);break; default: LeftTerm=RightTerm; } LeftOp=RightOp; LeftPrec=RightPrec; } int EvalParse::GetInt() { Error=ERR_NONE; return (int) Evaluate(); } double EvalParse::GetDouble() { Error=ERR_NONE; return Evaluate(); }