# nedcompiler.h

Go to the documentation of this file.

    00001 //==========================================================================
    00002 // nedcompiler.h -
    00003 //
    00004 //                     OMNeT++/OMNEST
    00005 //            Discrete System Simulation in C++
    00006 //
    00007 // Contents:
    00008 //   class NEDCompiler
    00009 //
    00010 //==========================================================================
    00011
    00012 /*--------------------------------------------------------------*
    00013   Copyright (C) 2002-2005 Andras Varga
    00014
    00015   This file is distributed WITHOUT ANY WARRANTY. See the file
    00016   `license' for details on this and other legal matters.
    00017 *--------------------------------------------------------------*/
    00018
    00019
    00020 #ifndef __NEDCOMPILER_H
    00021 #define __NEDCOMPILER_H
    00022
    00023 #include <map>
    00024 #include <vector>
    00025 #include <string>
    00026 #include "nedelements.h"
    00027
    00028
    00029 struct ltstr
    00030 {
    00031   bool operator()(const char* s1, const char* s2) const  {return strcmp(s1,s2)<0;}
    00032 };
    00033 typedef std::map<const char *,NEDElement *,ltstr> NEDMap;
    00034
    00035 typedef std::vector<std::string> NEDStringVector;
    00036
    00037
    00045 class NEDFileCache
    00046 {
    00047   protected:
    00048     NEDMap importedfiles;
    00049
    00050   public:
    00052     NEDFileCache();
    00053
    00055     ~NEDFileCache();
    00056
    00058     void addFile(const char *name, NEDElement *node);
    00059
    00061     NEDElement *getFile(const char *name);
    00062 };
    00063
    00064
    00071 class NEDSymbolTable
    00072 {
    00073   protected:
    00074     // hash tables for channel, module and network declarations:
    00075     NEDMap channels;
    00076     NEDMap modules;
    00077     NEDMap networks;
    00078
    00079     // subclassing: enums, classes, messages, objects
    00080     NEDMap enums;
    00081     NEDMap classes;
    00082
    00083   public:
    00085     NEDSymbolTable();
    00086
    00088     ~NEDSymbolTable();
    00089
    00095     void add(NEDElement *node);
    00096
    00100     NEDElement *getChannelDeclaration(const char *name);
    00101
    00103     NEDElement *getModuleDeclaration(const char *name);
    00104
    00106     NEDElement *getNetworkDeclaration(const char *name);
    00107
    00109     NEDElement *getEnumDeclaration(const char *name);
    00110
    00112     NEDElement *getClassDeclaration(const char *name);
    00114 };
    00115
    00116
    00122 class NEDImportResolver
    00123 {
    00124   public:
    00126     NEDImportResolver() {}
    00127
    00129     virtual ~NEDImportResolver() {}
    00130
    00134     virtual NEDElement *loadImport(const char *import) = 0;
    00135 };
    00136
    00137
    00145 class NEDClassicImportResolver : public NEDImportResolver
    00146 {
    00147   protected:
    00148     NEDStringVector importpath;
    00149
    00150   public:
    00152     NEDClassicImportResolver() {}
    00153
    00155     virtual ~NEDClassicImportResolver() {}
    00156
    00160     void addImportPath(const char *dir);
    00161
    00165     virtual NEDElement *loadImport(const char *import);
    00166 };
    00167
    00168
    00186 class NEDCompiler
    00187 {
    00188   protected:
    00189     NEDMap imports;  // list of already imported modules (to avoid double importing)
    00190
    00191     NEDFileCache *filecache;
    00192     NEDSymbolTable *symboltable;
    00193     NEDImportResolver *importresolver;
    00194
    00195     void addImport(const char *name);
    00196     bool isImported(const char *name);
    00197     void doValidate(NEDElement *tree);
    00198
    00199   public:
    00201     NEDCompiler(NEDFileCache *fcache, NEDSymbolTable *symtab, NEDImportResolver *importres);
    00202
    00204     virtual ~NEDCompiler();
    00205
    00210     void validate(NEDElement *tree);
    00211 };
    00212
    00213 #endif
    00214