Main Page   Modules   Class Hierarchy   Compound List   File List   Compound Members  

nedcompiler.h

00001 //==========================================================================
00002 // nedcompiler.h - part of the OMNeT++ Discrete System Simulation System
00003 //
00004 // Contents:
00005 //   class NEDCompiler
00006 //
00007 //==========================================================================
00008 
00009 /*--------------------------------------------------------------*
00010   Copyright (C) 2002-2003 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 
00017 #ifndef __NEDCOMPILER_H
00018 #define __NEDCOMPILER_H
00019 
00020 #include <map>
00021 #include <vector>
00022 #include <string>
00023 #include "nedelements.h"
00024 
00025 
00026 struct ltstr
00027 {
00028   bool operator()(const char* s1, const char* s2) const  {return strcmp(s1,s2)<0;}
00029 };
00030 typedef std::map<const char *,NEDElement *,ltstr> NEDMap;
00031 
00032 typedef std::vector<std::string> NEDStringVector;
00033 
00034 
00042 class NEDFileCache
00043 {
00044   protected:
00045     NEDMap importedfiles;
00046 
00047   public:
00048     NEDFileCache();
00049     ~NEDFileCache();
00050     void addFile(const char *name, NEDElement *node);
00051     NEDElement *getFile(const char *name);
00052 };
00053 
00054 
00061 class NEDSymbolTable
00062 {
00063   protected:
00064     // hash tables for channel, module and network declarations:
00065     NEDMap channels;
00066     NEDMap modules;
00067     NEDMap networks;
00068 
00069     // subclassing: enums, classes, messages, objects
00070     NEDMap enums;
00071     NEDMap classes;
00072 
00073   public:
00074     NEDSymbolTable();
00075     ~NEDSymbolTable();
00076 
00077     void add(NEDElement *node);
00078     NEDElement *getChannelDeclaration(const char *name);
00079     NEDElement *getModuleDeclaration(const char *name);
00080     NEDElement *getNetworkDeclaration(const char *name);
00081     NEDElement *getEnumDeclaration(const char *name);
00082     NEDElement *getClassDeclaration(const char *name);
00083 };
00084 
00085 
00091 class NEDImportResolver
00092 {
00093   public:
00094     NEDImportResolver() {}
00095     virtual ~NEDImportResolver() {}
00096     virtual NEDElement *loadImport(const char *import) = 0;
00097 };
00098 
00099 
00107 class NEDClassicImportResolver : public NEDImportResolver
00108 {
00109   protected:
00110     NEDStringVector importpath;
00111   public:
00112     NEDClassicImportResolver() {}
00113     virtual ~NEDClassicImportResolver() {}
00114     void addImportPath(const char *dir);
00115     virtual NEDElement *loadImport(const char *import);
00116 };
00117 
00118 
00131 class NEDCompiler
00132 {
00133   protected:
00134     NEDMap imports;  // list of already imported modules (to avoid double importing)
00135 
00136     NEDFileCache *filecache;
00137     NEDSymbolTable *symboltable;
00138     NEDImportResolver *importresolver;
00139 
00140     void addImport(const char *name);
00141     bool isImported(const char *name);
00142     void doValidate(NEDElement *tree);
00143 
00144   public:
00148     NEDCompiler(NEDFileCache *fcache, NEDSymbolTable *symtab, NEDImportResolver *importres);
00149 
00153     virtual ~NEDCompiler();
00154 
00158     void validate(NEDElement *tree);
00159 };
00160 
00161 #endif
00162 

Generated at Mon Jun 16 23:37:38 2003 for OMNeT++NEDXML by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001