00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef MAKEDEPEND
00011 #include <iostream>
00012 #include <math.h>
00013 #include <stack>
00014 #include <algorithm>
00015 #include <sstream>
00016 #endif
00017
00018 #include "SeExprNode.h"
00019 #include "SeExprParser.h"
00020 #include "SeExprFunc.h"
00021 #include "SeExpression.h"
00022
00023 using namespace std;
00024
00025 SeExpression::SeExpression()
00026 : _wantVec(true), _parseTree(0), _parsed(0), _prepped(0)
00027 {
00028 SeExprFunc::init();
00029 }
00030
00031
00032 SeExpression::SeExpression( const std::string &e, bool wantVec )
00033 : _wantVec(wantVec), _expression(e), _parseTree(0),
00034 _parsed(0), _prepped(0)
00035 {
00036 SeExprFunc::init();
00037 }
00038
00039 SeExpression::~SeExpression()
00040 {
00041 reset();
00042 }
00043
00044 void SeExpression::reset()
00045 {
00046 delete _parseTree;
00047 _parseTree = 0;
00048 _parsed = 0;
00049 _prepped = 0;
00050 _parseError = "";
00051 _vars.clear();
00052 _funcs.clear();
00053 _localVars.clear();
00054 _errors.clear();
00055 for(size_t i=0;i<_stringTokens.size();i++) free(_stringTokens[i]);
00056 _stringTokens.clear();
00057 _threadUnsafeFunctionCalls.clear();
00058 }
00059
00060 void SeExpression::setWantVec(bool wantVec)
00061 {
00062 reset();
00063 _wantVec = wantVec;
00064 }
00065
00066 void SeExpression::setExpr(const std::string& e)
00067 {
00068 reset();
00069 _expression = e;
00070 }
00071
00072 bool SeExpression::syntaxOK() const
00073 {
00074 parseIfNeeded();
00075 return _parseTree != 0;
00076 }
00077
00078 bool SeExpression::isValid() const
00079 {
00080 prepIfNeeded();
00081 return _parseTree != 0;
00082 }
00083
00084 bool SeExpression::isConstant() const
00085 {
00086 parseIfNeeded();
00087 return _vars.empty() && _funcs.empty();
00088 }
00089
00090 bool SeExpression::usesVar(const std::string& name) const
00091 {
00092 parseIfNeeded();
00093 return _vars.find(name) != _vars.end();
00094 }
00095
00096 bool SeExpression::usesFunc(const std::string& name) const
00097 {
00098 parseIfNeeded();
00099 return _funcs.find(name) != _funcs.end();
00100 }
00101
00102 void
00103 SeExpression::parse() const
00104 {
00105 if (_parsed) return;
00106 _parsed = true;
00107 int tempStartPos,tempEndPos;
00108 SeExprParse(_parseTree, _parseError, tempStartPos, tempEndPos,
00109 this, _expression.c_str(), &_stringTokens);
00110 if(!_parseTree){
00111 addError(_parseError,tempStartPos,tempEndPos);
00112 }
00113 }
00114
00115 void
00116 SeExpression::prep() const
00117 {
00118 if (_prepped) return;
00119 _prepped = true;
00120 parseIfNeeded();
00121 if (_parseTree && !_parseTree->prep(wantVec())) {
00122
00123 std::vector<int> lines;
00124 const char* start=_expression.c_str();
00125 const char* p=_expression.c_str();
00126 while(*p!=0){
00127 if(*p=='\n') lines.push_back(p-start);
00128 p++;
00129 }
00130 lines.push_back(p-start);
00131
00132 std::stringstream sstream;
00133 sstream<<"Prep errors:"<<std::endl;
00134 for(unsigned int i=0;i<_errors.size();i++){
00135 int* bound=lower_bound(&*lines.begin(),&*lines.end(),_errors[i].startPos);
00136 int line=bound-&*lines.begin()+1;
00137
00138 sstream<<" Line "<<line<<": "<<_errors[i].error<<std::endl;
00139 }
00140 _parseError=std::string(sstream.str());
00141
00142 delete _parseTree; _parseTree = 0;
00143 }
00144 }
00145
00146
00147 bool
00148 SeExpression::isVec() const
00149 {
00150 prepIfNeeded();
00151 return _parseTree ? _parseTree->isVec() : _wantVec;
00152 }
00153
00154 SeVec3d
00155 SeExpression::evaluate() const
00156 {
00157 prepIfNeeded();
00158 if (_parseTree) {
00159
00160 for (LocalVarTable::iterator iter = _localVars.begin();
00161 iter != _localVars.end(); iter++)
00162 iter->second.val = 0.0;
00163
00164 SeVec3d vec;
00165 _parseTree->eval(vec);
00166 if (_wantVec && !isVec())
00167 vec[1] = vec[2] = vec[0];
00168 return vec;
00169 }
00170 else return SeVec3d(0,0,0);
00171 }