00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef __CPPEXPRGENERATOR_H
00017 #define __CPPEXPRGENERATOR_H
00018
00019 #include <string>
00020 #include <map>
00021 #include <vector>
00022 #include <iostream>
00023 #include "nedelements.h"
00024
00025 using std::ostream;
00026 class NEDSymbolTable;
00027
00028
00044 class CppExpressionGenerator
00045 {
00046 protected:
00047 typedef std::vector<NEDElement *> NEDElementVector;
00048 struct ExpressionInfo {
00049 ExpressionNode *expr;
00050 int ctxtype;
00051 NEDElement *submoduleTypeDecl;
00052 std::string name;
00053 NEDElementVector ctorargs;
00054 NEDElementVector cachedvars;
00055 };
00056 typedef std::map<ExpressionNode *,ExpressionInfo> NEDExpressionMap;
00057
00058 static int count;
00059 ostream& out;
00060 NEDSymbolTable *symboltable;
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, NEDElement *currentSubmodTypeDecl);
00070 void collectExpressionInfo(ExpressionNode *expr, NEDElement *currentSubmodTypeDecl);
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, NEDElement *currentSubmodTypeDecl);
00087
00088 public:
00092 CppExpressionGenerator(ostream& out, NEDSymbolTable *symboltable);
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