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 } } } /* namespace gridripper::math::expr */
00220 
00221 #endif /* gridripper_math_expr_Expr_h */

Generated on Wed Jun 17 18:46:47 2009 for GridRipper by  doxygen 1.5.6