00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __CPPEXPRGENERATOR_H
00015 #define __CPPEXPRGENERATOR_H
00016
00017 #ifdef _MSC_VER
00018
00019
00020 #pragma warning(disable:4786)
00021 #endif
00022
00023 #include <string>
00024 #include <map>
00025 #include <vector>
00026 #include <iostream>
00027 #include "nedelements.h"
00028
00029 using std::ostream;
00030
00046 class CppExpressionGenerator
00047 {
00048 protected:
00049 typedef std::vector<NEDElement *> NEDElementVector;
00050 struct ExpressionInfo {
00051 ExpressionNode *expr;
00052 int ctxtype;
00053 std::string name;
00054 NEDElementVector ctorargs;
00055 NEDElementVector cachedvars;
00056 };
00057 typedef std::map<ExpressionNode *,ExpressionInfo> NEDExpressionMap;
00058
00059 static int count;
00060 ostream& out;
00061 NEDExpressionMap exprMap;
00062
00063 enum {
00064 MODE_INLINE_EXPRESSION,
00065 MODE_EXPRESSION_CLASS,
00066 };
00067
00068 void doExtractArgs(ExpressionInfo& info, NEDElement *node);
00069 void doCollectExpressions(NEDElement *node);
00070 void collectExpressionInfo(ExpressionNode *expr);
00071 void generateExpressionClass(ExpressionInfo& info);
00072 const char *getTypeForArg(NEDElement *node);
00073 const char *getNameForArg(NEDElement *node);
00074 void doValueForArg(NEDElement *node);
00075 void doValueForCachedVar(NEDElement *node);
00076
00077 void generateChildren(NEDElement *node, const char *indent, int mode);
00078 void generateItem(NEDElement *node, const char *indent, int mode);
00079 void doOperator(OperatorNode *node, const char *indent, int mode);
00080 void doFunction(FunctionNode *node, const char *indent, int mode);
00081 void doParamref(ParamRefNode *node, const char *indent, int mode);
00082 void doIdent(IdentNode *node, const char *indent, int mode);
00083 void doConst(ConstNode *node, const char *indent, int mode);
00084 void doExpression(ExpressionNode *node, const char *indent, int mode);
00085
00086 bool needsExpressionClass(ExpressionNode *expr);
00087
00088 public:
00092 CppExpressionGenerator(ostream& out);
00093
00097 ~CppExpressionGenerator() {}
00098
00103 void collectExpressions(NEDElement *node);
00104
00110 void generateExpressionClasses();
00111
00116 void generateExpressionUsage(ExpressionNode *expr, const char *indent);
00117 };
00118
00119 #endif
00120
00121