diff options
Diffstat (limited to 'TAO/orbsvcs/PSS/PSDL_Scope.h')
-rw-r--r-- | TAO/orbsvcs/PSS/PSDL_Scope.h | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/TAO/orbsvcs/PSS/PSDL_Scope.h b/TAO/orbsvcs/PSS/PSDL_Scope.h new file mode 100644 index 00000000000..0e7ad9d0862 --- /dev/null +++ b/TAO/orbsvcs/PSS/PSDL_Scope.h @@ -0,0 +1,294 @@ +/* -*- C++ -*- */ +// $Id$ +// +// ================================================================== +// +// = LIBRARY +// PSS +// +// = FILENAME +// PSDL_Scope +// +// = DESCRIPTION +// This Class is a base class for building the ASTs. The derived +// classes override the virtual methods that they need. The class +// also contains the methods which are common to all the derived +// classes. +// +// = AUTHOR +// Priyanka Gontla <gontla_p@ociweb.com> +// +// ================================================================== + +#ifndef TAO_PSDL_SCOPE_H +#define TAO_PSDL_SCOPE_H + +#include /**/ "ace/pre.h" + +#include "tao/corbafwd.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "psdl_export.h" + +#include "tao/TAO_Singleton.h" + +#include "ace/Hash_Map_Manager_T.h" +#include "ace/Array_Base.h" +#include "ace/SString.h" + + +// Fwd Declarations. +class TAO_PSDL_Node; +class TAO_PSDL_Scope; +class TAO_PSDL_Root_Scope; +class TAO_PSDL_Stream; + +typedef ACE_Hash_Map_Manager_Ex<ACE_CString, TAO_PSDL_Scope *, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, TAO_SYNCH_MUTEX> Scope_Map; + +typedef Scope_Map::iterator Scope_Map_Iterator; + +class TAO_PSDL_Export TAO_PSDL_Scope +{ + // The TAO_PSDL_Scope class serves two purposes. One it acts as the + // base class from which the child classes derive to be able to add + // the members in their scopes. TAO_PSDL_Root_Scope is the root + // scope where any thing goes into. If there is a module in the idl + // file, all the members in the module are to be added to an + // instance of TAO_PSDL_Module_Scope. And, it also acts as a class + // that has the common members to be accessed by all the derived + // classes. For example, add_module_to_scope is the common method + // for all the sub-classes to invoke from the add_module method. + friend class TAO_Singleton<TAO_PSDL_Scope, TAO_SYNCH_MUTEX>; + +public: + + TAO_PSDL_Scope (void); + + virtual ~TAO_PSDL_Scope (void); + + /// The add functions are overridden by the derived classes to add + /// the respective types in their scopes. The return value is a '0' + /// if successful and '-1' if it ends up as a failure. + virtual int add_module (ACE_CString identifier); + + virtual int add_interface (ACE_CString identifier); + + virtual int add_struct (ACE_CString identifier); + + virtual int add_typedef (ACE_CString identifier, + ACE_CString identifier_type); + + virtual int add_const_decl (ACE_CString identifier, + ACE_CString identifier_type); + + virtual int add_except_decl (ACE_CString identifier, + ACE_CString identifier_type); + + virtual int add_exception (ACE_CString identifier); + + virtual int add_op_dcl (ACE_CString identifier); + + virtual int add_member_decl (ACE_CString identifier, + ACE_CString identifier_type); + + /// Return the top scope. + virtual TAO_PSDL_Scope *pop_top_scope (void); + + /// Push the scope that is passed into the stack of scopes. + virtual void push_scope (TAO_PSDL_Scope *scope); + + /// Return the pointer to the parent scope. + virtual TAO_PSDL_Scope *parent_scope (void); + + /// Return the pointer to Scope_Map of the instance. + virtual Scope_Map *scope_map (void); + + /// Function to help indent the output of the parse tree. + virtual void dump (CORBA::ULong depth); + + /// Function to find the TAO_PSDL_Scope for the given identifier_name + virtual int find (const ACE_CString &identifier_name, + ACE_CString &identifier_type); + + /// Function to check if a particular identifier_name exists in the + /// scope. + virtual int find (const ACE_CString &identifier_name); + + /// To get the name of the module to which an identifier_name + /// belongs. returns '0' on succes and '-1' on failure. + virtual int get_module_name (const ACE_CString &identifier_name, + ACE_CString &module_name); + + /// To get the name of the interface to which an identifier_name + /// belongs. returns '0' on succes and '-1' on failure. + virtual int get_interface_name (const ACE_CString &identifier_name, + ACE_CString &interface_name); + + /// Each identifier will have an instance of a derived type of + /// TAO_PSDL_Scope *.. the following method is an accessor to the + /// type of the identifier name + virtual ACE_CString identifier_type (void); + virtual ACE_CString module_name (void); + virtual ACE_CString interface_name (void); + + /// As the function name implies, the following methods help add the + /// respective types to the scope passed in. The return value is a + /// '0' on success and '-1' on a failure. + int add_module_to_scope (ACE_CString identifier, + TAO_PSDL_Scope *scope); + + int add_interface_to_scope (ACE_CString identifier, + TAO_PSDL_Scope *scope); + + int add_interface_dcl_to_scope (ACE_CString identifier, + TAO_PSDL_Scope *scope); + + int add_struct_to_scope (ACE_CString identifier, + TAO_PSDL_Scope *scope); + + int add_typedef_to_scope (ACE_CString identifier, + ACE_CString identifier_type, + TAO_PSDL_Scope *scope); + + int add_const_decl_to_scope (ACE_CString identifier, + ACE_CString identifier_type, + TAO_PSDL_Scope *scope); + + int add_except_decl_to_scope (ACE_CString identifier, + ACE_CString identifier_type, + TAO_PSDL_Scope *scope); + + int add_exception_to_scope (ACE_CString identifier, + TAO_PSDL_Scope *scope); + + int add_scoped_decl_to_scope (ACE_CString identifier, + ACE_CString identifier_type, + TAO_PSDL_Scope *scope); + + int add_enum_decl_to_scope (ACE_CString identifier, + ACE_CString identifier_type, + TAO_PSDL_Scope *scope); + + int add_op_dcl_to_scope (ACE_CString identifier, + TAO_PSDL_Scope *scope); + + int add_member_decl_to_scope (ACE_CString identifier, + ACE_CString identifier_type, + TAO_PSDL_Scope *scope); + + /// Set the root scope the very first time. + void set_root_scope (void); + + /// Set and get the name of the stub that has to be generated. The name + /// is based on the input file that is passed to the compiler. + void set_stub_prefix (const char *filename); + const ACE_CString &get_stub_prefix (void); + + /// These methods help write the header files that needs to be + /// included and other initialization part to the stubs. + void header_initialization (TAO_PSDL_Stream *ps_sh); + void stub_initialization (TAO_PSDL_Stream *ps_si); + + /// Get the pointer to the TAO_PSDL_Stream for the stub header. + TAO_PSDL_Stream *get_sh (void); + + /// Get the pointer to the TAO_PSDL_Stream for the stub + /// implementation file. + TAO_PSDL_Stream *get_si (void); + + /// Get the pointer to the TAO_PSDL_Stream for the stub + /// inline file. + TAO_PSDL_Stream *get_sinline (void); + + /// As the name suggests, check if the identifier name is already + /// used for something else in the sc + int check_identifier (ACE_CString identifier, + TAO_PSDL_Scope *scope); + + /// This is to check if a forward declaration has been done + /// already. + void check_name_in_scope (ACE_CString identifier, + TAO_PSDL_Scope *scope); + + /// Return a unique instance + static TAO_PSDL_Scope *instance (void); + + /// This wont be necessary in the final version .. its helpful to + /// print the symbol table to the std output for now. + void print_depth (CORBA::ULong depth); + + /// Method used to set the scope back to the previous one. + void set_scope (void); + + /// Set interface scope to the previous one. + void set_interface_scope (void); + + /// Set module scope to the previous one. + void set_module_scope (void); + + /// Methods to save and retrieve the identifier values. + void save_identifier (ACE_CString identifier); + ACE_CString get_identifier (void); + + /// Accessor methods to the name of the name_space: Module name + void set_name_space (ACE_CString name_space); + ACE_CString get_name_space (void); + + /// Accessor methods to the name of the current interface. + void set_interface_name (ACE_CString interface_name); + ACE_CString get_interface_name (void); + + // Helper method for the semantic checking. By converting all the + // identifiers to lower case before adding to the scope. + void to_lower_case (ACE_CString &identifier); + + /// Helper method to convert the int value of the identifier type to + /// its string equivalent based on the conversion values generated + /// by the Yacc Parser (please see PSDL_y.h for the conversion values). + ACE_CString convert_str (int identifier_type); + +private: + + /// Array of TAO_PSDL_Scope pointers to be used with the singleton + /// instance. + TAO_PSDL_Scope **psdl_scope_; + + /// Save the psdl_scopes for use while writing + /// to stubs. + ACE_Array_Base <TAO_PSDL_Scope *> ast_scope_; + + /// Arrays to save the module and interface names + ACE_Array_Base <ACE_CString> module_names_; + ACE_Array_Base <ACE_CString> interface_names_; + + /// Count of the members in the psdl_scope_ + unsigned long psdl_scope_top_; + + /// Pointer to the instance of the TAO_PSDL_Root_Scope. + TAO_PSDL_Root_Scope *root_scope_; + + /// Identifier used for the save_identifier and get_identifier + /// methods. + ACE_CString identifier_; + + /// Save for use while writing to stubs. + ACE_CString name_space_; + ACE_CString interface_name_; + + /// Name of the filename that is passed to the compiler psdl_tao. + ACE_CString stub_prefix_; + + /// Pointers to the TAO_PSDL_Streams for the stub header, + /// implementation and inline files. + TAO_PSDL_Stream *ps_sh_; + TAO_PSDL_Stream *ps_si_; + TAO_PSDL_Stream *ps_sin_; + +}; + +#include /**/ "ace/post.h" + +#endif /* TAO_PSDL_SCOPE_H */ |