idlscope.h

来自「编译工具」· C头文件 代码 · 共 351 行

H
351
字号
// -*- c++ -*-//                          Package   : omniidl// idlscope.h               Created on: 1999/10/11//			    Author    : Duncan Grisby (dpg1)////    Copyright (C) 1999 AT&T Laboratories Cambridge////  This file is part of omniidl.////  omniidl is free software; you can redistribute it and/or modify it//  under the terms of the GNU General Public License as published by//  the Free Software Foundation; either version 2 of the License, or//  (at your option) any later version.////  This program is distributed in the hope that it will be useful,//  but WITHOUT ANY WARRANTY; without even the implied warranty of//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU//  General Public License for more details.////  You should have received a copy of the GNU General Public License//  along with this program; if not, write to the Free Software//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA//  02111-1307, USA.//// Description://   //   Definitions for scope manipulation// $Id: idlscope.h,v 1.5.2.4 2001/10/29 17:42:43 dpg1 Exp $// $Log: idlscope.h,v $// Revision 1.5.2.4  2001/10/29 17:42:43  dpg1// Support forward-declared structs/unions, ORB::create_recursive_tc().//// Revision 1.5.2.3  2000/10/27 16:31:10  dpg1// Clean up of omniidl dependencies and types, from omni3_develop.//// Revision 1.5.2.2  2000/10/10 10:18:51  dpg1// Update omniidl front-end from omni3_develop.//// Revision 1.3.2.2  2000/09/19 09:14:26  dpg1// Scope::Entry::Kind renamed to Scope::Entry::EntryKind to avoid// problems with over-keen compilers//// Revision 1.3.2.1  2000/08/29 15:20:29  dpg1// New relativeScope() function. New -i flag to enter interactive loop// after parsing//// Revision 1.3  1999/11/02 17:07:25  dpg1// Changes to compile on Solaris.//// Revision 1.2  1999/10/29 10:01:50  dpg1// Global scope initialisation changed.//// Revision 1.1  1999/10/27 14:05:55  dpg1// *** empty log message ***//#ifndef _idlscope_h_#define _idlscope_h_#include <idlutil.h>// Class to represent an absolute or relative scoped name as a list.class ScopedName {public:  class Fragment {  public:    // Constructor copies identifier    Fragment(const char* identifier) :      next_(0), identifier_(idl_strdup(identifier)) {}    ~Fragment() {      delete [] identifier_;    }    inline const char* identifier() const { return identifier_; }    inline Fragment*   next()       const { return next_; };  protected:    Fragment* next_;  private:    char* identifier_;    friend class ScopedName;  };  ScopedName(const char* identifier, IDL_Boolean absolute);  // Copy constructors  ScopedName(const ScopedName* sn);  ScopedName(const Fragment*   frags, IDL_Boolean absolute);  ~ScopedName();  // Return the scope list  Fragment* scopeList() const { return scopeList_; }  // Is the name absolute (i.e. ::A::... rather than A::...)  IDL_Boolean absolute() const { return absolute_; }  // toString() returns a new string containing the stringified  // name. The caller is responsible for deleting it. If qualify is  // true, and the name is absolute, prefix with ::, otherwise do not.  char* toString(IDL_Boolean qualify=0) const;  IDL_Boolean equal(const ScopedName* sn) const;  // Append a new fragment  void append(const char* identifier);private:  Fragment*      scopeList_;  Fragment*      last_;  IDL_Boolean    absolute_;};// Class to represent a scopeclass Decl;class IdlType;class InheritSpec;class ValueInheritSpec;class Scope {public:  class Entry;			// Entry in a scope  class EntryList;		// Linked list of entries  enum Kind { S_GLOBAL, S_MODULE, S_INTERFACE, S_STRUCT, S_EXCEPTION,	      S_UNION, S_OPERATION, S_VALUE };  // Static functions to return the current and global scopes  static Scope* global()  { return global_; }  static Scope* current() { return current_; }  // Static functions to initialise and clear the global and CORBA:: scopes  static void init();  static void clear();  // Functions to create new sub-scopes of the current scope. If  // newModuleScope() is asked to create a module scope which already  // exists, it re-opens the existing scope.  Scope* newModuleScope   (const char* identifier, const char* file, int line);  Scope* newInterfaceScope(const char* identifier, const char* file, int line);  Scope* newStructScope   (const char* identifier, const char* file, int line);  Scope* newExceptionScope(const char* identifier, const char* file, int line);  Scope* newUnionScope    (const char* identifier, const char* file, int line);  Scope* newOperationScope(const char* file, int line);  Scope* newValueScope    (const char* identifier, const char* file, int line);  // Change the current scope  static void startScope(Scope* s);  static void endScope();  // Create an unnamed or named scope. If the nestedUse flag is true,  // use of identifiers in child scopes are considered uses within  // this scope. This is true for scopes created by interfaces and  // valuetypes, but not those created by modules. If the parent scope  // has nestedUse true, this scope sets it too.  Scope(Scope* parent, Kind k, IDL_Boolean nestedUse,	const char* file, int line);  Scope(Scope* parent, const char* identifier,	Kind k, IDL_Boolean nestedUse,	const char* file, int line);  ~Scope();  // For interfaces, set a list of inherited Scopes. Checks that  // inheritance has not added any clashing operation or attribute  // names.  void setInherited(InheritSpec*      inherited, const char* file, int line);  void setInherited(ValueInheritSpec* inherited, const char* file, int line);  // Query interface  Scope*            parent()     const { return parent_; }  Kind              kind()       const { return kind_; }  const char*       identifier() const { return identifier_; }  const ScopedName* scopedName() const { return scopedName_; }  IDL_Boolean       nestedUse()  const { return nestedUse_; }  Entry*            entries()    const { return entries_; }  // Functions to lookup and add entries to the scope, reporting any  // violations of the IDL scope rules as errors.  // Find an entry in this scope.  Entry* find(const char* identifier) const;  // Find an entry in this scope, ignoring case  Entry* iFind(const char* identifier) const;  // Find entries in this scope or inherited scopes. Does not return  // USE or PARENT entries.  EntryList* findWithInheritance(const char* identifier) const;  EntryList* iFindWithInheritance(const char* identifier) const;  // Find an entry based on a ScopedName. File and line requesting the  // find are given so errors can be reported nicely. If file and line  // are zero, do not report errors.  const Entry* findScopedName(const ScopedName* sn,			      const char* file = 0, int line = 0) const;  // Find an entry based on a ScopedName, and mark it as used in this  // scope (and any parent scopes with nestedUse true).  const Entry* findForUse(const ScopedName* sn, const char* file, int line);  void addUse(const ScopedName* sn, const char* file, int line);  // Given source and destination ScopedNames, construct a relative or  // absolute ScopedName which uniquely identifies the destination  // from within the scope of the source. Returns 0 if either scoped  // name does not exist, or is not absolute.  static ScopedName* relativeScopedName(const ScopedName* from,					const ScopedName* to);  // The following add functions take identifiers with _ escape  // characters intact, so they can properly detect clashes with  // keywords.  // Add a module, or do nothing if the module was already added  void addModule(const char* identifier,		 Scope* scope,		 Decl* decl,		 const char* file, int line);  // Add a declaration  void addDecl(const char* identifier,	       Scope*      scope,   // Scope formed by this declaration, if any	       Decl*       decl,    // Decl object for this declaration	       IdlType*    idltype, // IdlType for this declaration	       const char* file, int line);  // Add an operation or attribute  void addCallable(const char* identifier, Scope* scope, Decl* decl,		   const char* file, int line);  // Add an inherited operation or attribute  void addInherited(const char* identifier, Scope* scope, Decl* decl,		    Entry* inh_from, const char* file, int line);  // Add an instance  void addInstance(const char* identifier,		   Decl* decl,	      // Declaration of the instance		   IdlType* idltype,  // Type of the instance		   const char* file, int line);  // Remove an entry. Only used to remove a forward declared interface  // when the full definition comes along.  void remEntry(Entry* e);  class Entry {  public:    enum EntryKind {      E_MODULE,			// Module      E_DECL,			// Declaration      E_CALLABLE,		// Operation or attribute      E_INHERITED,		// Inherited callable      E_INSTANCE,		// Instance of a type      E_USE,			// Identifier introduced through use      E_PARENT			// Name of enclosing scope    };    Entry(const Scope* container, EntryKind kind, const char* identifier,	  Scope* scope, Decl* decl, IdlType* idltype, Entry* inh_from,	  const char* file, int line);    ~Entry();    const Scope*      container()  const { return container_; }    EntryKind         kind()       const { return kind_; }    const char*       identifier() const { return identifier_; }    const ScopedName* scopedName() const { return scopedName_; }    const char*       file()       const { return file_; }    int               line()       const { return line_; }    // Scope, Decl, IdlType, and Entry inherited from, if appropriate,    // null if not    Scope*            scope()      const { return scope_; }    Decl*             decl()       const { return decl_; }    IdlType*          idltype()    const { return idltype_; }    Entry*            inh_from()   const { return inh_from_; }    // Linked list inside Scope    Entry*            next()       const { return next_; }  private:    const Scope*      container_;    EntryKind         kind_;    char*             identifier_;    ScopedName*       scopedName_;    Scope*            scope_;    Decl*             decl_;    IdlType*          idltype_;    Entry*            inh_from_;    char*             file_;    int               line_;    Entry*            next_;        friend class Scope;  };  class EntryList {  public:    EntryList(const Entry* e) : head_(e), next_(0) { last_ = this; }    ~EntryList() { if (next_) delete next_; }    const Entry* head() const { return head_; }    EntryList*   tail() const { return next_; }    void append(EntryList* el) {      last_->next_ = el;      last_        = el->last_;    }    void merge(EntryList* ml);  private:    const Entry* head_;  protected:    EntryList* next_;    EntryList* last_;  };private:  Scope*            parent_;  Kind              kind_;  char*             identifier_;  ScopedName*       scopedName_;  IDL_Boolean       nestedUse_;  Entry*            entries_;  Entry*            last_;  InheritSpec*      inherited_;  ValueInheritSpec* valueInherited_;  static Scope*     global_;  static Scope*     current_;  void appendEntry(Entry* e);  IDL_Boolean keywordClash(const char* identifier,			   const char* file, int line);};#endif // _idlscope_h_

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?