00001 #ifndef IONFLUX_TOOLS_TREEEVAL
00002 #define IONFLUX_TOOLS_TREEEVAL
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <string>
00030 #include <iostream>
00031 #include <sstream>
00032 #include <vector>
00033 #include <stack>
00034 #include <ionflux/tools.hpp>
00035 #include <ionflux/Tokenizer.hpp>
00036 #include <ionflux/Tree.hpp>
00037 #include <ionflux/TreeResolver.hpp>
00038
00039 namespace Ionflux
00040 {
00041
00042 namespace Tools
00043 {
00044
00045 class Tree;
00046 struct DataEntry;
00047 struct TreeExprElement;
00048
00054 class TreeEval
00055 {
00056 protected:
00067 static bool calculate(DataEntry &op1, DataEntry &result,
00068 const std::string &op);
00069
00081 static bool calculate(DataEntry &op1, DataEntry &op2,
00082 DataEntry &result, const std::string &op);
00083
00099 static bool unwindOpStack(std::stack<TreeExprElement> &ops,
00100 std::stack<TreeExprElement> &values, Tree &temps,
00101 bool unwindPar = false);
00102
00103 public:
00105 static const TokenType TT_OPERATOR;
00107 static const TokenType TT_TREEPATH_NP;
00109 static const TokenType TT_PAR_LEFT;
00111 static const TokenType TT_PAR_RIGHT;
00112
00117 TreeEval();
00118
00123 virtual ~TreeEval();
00124
00134 static bool parseTreeExpr(const std::string &treeExpr,
00135 std::vector<TreeExprElement> &elements);
00136
00151 static bool eval(Tree *tree, std::vector<TreeExprElement> &elements,
00152 Node &result, bool createPath);
00153 };
00154
00155 }
00156
00157 }
00158
00162 #endif