cppexprgenerator.h

Go to the documentation of this file.
00001 //==========================================================================
00002 //  CPPEXPRGENERATOR.H - part of
00003 //
00004 //                     OMNeT++/OMNEST
00005 //            Discrete System Simulation in C++
00006 //
00007 //==========================================================================
00008 
00009 /*--------------------------------------------------------------*
00010   Copyright (C) 2002-2005 Andras Varga
00011 
00012   This file is distributed WITHOUT ANY WARRANTY. See the file
00013   `license' for details on this and other legal matters.
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; // tagcode of toplevel element which contains this expr.
00051         NEDElement *submoduleTypeDecl; // if submodule or network, the type decl.
00052         std::string name; // generated expression class name (Expr0, Expr1, etc)
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 

Generated on Sat Oct 21 17:47:58 2006 for OMNeT++/OMNEST NEDXML by  doxygen 1.4.6