Expr.h
00001 #ifndef gridripper_math_expr_Expr_h
00002 #define gridripper_math_expr_Expr_h
00003
00004 #include "StkArg.h"
00005 #include <gridripper/lang/Exception.h>
00006 #include <gridripper/tvector.h>
00007 #include <string>
00008
00009 namespace gridripper { namespace math { namespace expr {
00010
00011 class StkOpRepository;
00012 class StkConst;
00013 class StkVar;
00014
00015 using namespace std;
00016
00043 class Expr: public StkFunc
00044 {
00045 public:
00046
00050 class Error: public Exception {
00051 public:
00053 Error(const Error& other): Exception(other) { }
00054
00060 Error(const string& what, const string& where): Exception(what, where) { }
00061 };
00062
00063 private:
00064 string exprString;
00065 tvector<StkArg*> functionArgs;
00066 StkOp** program;
00067 bool myFuncRep;
00068 StkOpRepository* funcRep;
00069 tvector<StkOp*> funcs;
00070 tvector<StkConst*> nums;
00071 tvector<bool> varUsed;
00072 tvector<Expr*> myOwnExpressions;
00073 int stackSize;
00074 int maxStackSize;
00075 GReal_t* stack;
00076
00077 public:
00082 Expr(const string& s) throw(Error&);
00083
00090 Expr(const string& s, const tvector<StkOp*>& funcs,
00091 StkOpRepository* funcRep = NULL) throw(Error&);
00092
00093 ~Expr();
00094
00095 private:
00100 Expr(const Expr& other);
00101
00102 public:
00107 const string& getString() const { return exprString; }
00108
00114 string getProgramListString() const;
00115
00117 GReal_t eval();
00118
00123 bool isConstant() const;
00124
00130 bool dependsOn(const StkOp& f) const;
00131
00133 bool dependsOnVariables() const;
00134
00141 void replaceVar(const string& name, StkVar& var);
00142
00147 void evalStack(GReal_t*& stack) const;
00148
00153 StkOp** getInternalProgram() const { return program; }
00154
00159 virtual string getClassName() const { return "Expr"; }
00160
00161 public:
00165 static string::size_type findExprEnd(const string& str,
00166 string::size_type i);
00167
00168 private:
00169 void init();
00170 void create() throw(Error&);
00171 void parseFunc(const string& s) throw(Error&);
00172 void parseExpr(tvector<StkOp*>& progvec, const string& s)
00173 throw(Error&);
00174 void parseExpr0(tvector<StkOp*>& progvec, const string& s,
00175 string::const_iterator& K, StkOp** stk, StkOp**& stkp)
00176 throw(Error&);
00177 void createProgram(const tvector<StkOp*>& progvec) throw(Error&);
00178 void destruct();
00179 void checkSyntax(const string& s) throw(Error&);
00180 void addFunc(tvector<StkOp*>& progvec, StkOp* f);
00181 int findVar(const string& str, string::size_type k) const;
00182 int findFunc(const string& name) const;
00183
00185 string getProgramListString0() const;
00186
00191 void independ();
00192
00194 void collectExprsRecursively(tvector<Expr*>& oldxprs) const;
00195
00199 void replaceExprsInProgram(const tvector<Expr*>& oldxprs,
00200 const tvector<Expr*>& newxprs);
00201
00205 static string convertConditionOps(const string& str) throw(Error&);
00206
00210 static string::size_type findConditionColon(const string& str,
00211 string::size_type i);
00212
00216 static string convertEqualityOps(const string& str);
00217 };
00218
00219 } } }
00220
00221 #endif