home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / namet.ads < prev    next >
Text File  |  1996-09-28  |  14KB  |  257 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                                N A M E T                                 --
  6. --                                                                          --
  7. --                                 S p e c                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.53 $                             --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- The GNAT library is free software; you can redistribute it and/or modify --
  14. -- it under terms of the GNU Library General Public License as published by --
  15. -- the Free Software  Foundation; either version 2, or (at your option) any --
  16. -- later version.  The GNAT library is distributed in the hope that it will --
  17. -- be useful, but WITHOUT ANY WARRANTY;  without even  the implied warranty --
  18. -- of MERCHANTABILITY  or  FITNESS FOR  A PARTICULAR PURPOSE.  See the  GNU --
  19. -- Library  General  Public  License for  more  details.  You  should  have --
  20. -- received  a copy of the GNU  Library  General Public License  along with --
  21. -- the GNAT library;  see the file  COPYING.LIB.  If not, write to the Free --
  22. -- Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.        --
  23. --                                                                          --
  24. ------------------------------------------------------------------------------
  25.  
  26. with Types;   use Types;
  27. with Table;
  28.  
  29. with System;  use System;
  30. with System.Parameters;
  31.  
  32. package Namet is
  33.  
  34. --  WARNING: There is a C version of this package. Any changes to this
  35. --  source file must be properly reflected in the C header file namet.h
  36. --  which is created manually from namet.ads and namet.adb.
  37.  
  38. --  This package contains routines for handling the names table. The table
  39. --  is used to store character strings for identifiers and operator symbols,
  40. --  as well as other string values such as unit names and file names.
  41.  
  42. --  The forms of the entries are as follows:
  43.  
  44. --    Identifiers        Stored with upper case letters folded to lower case.
  45. --                       Upper half (16#80# bit set) and wide characters are
  46. --                       stored in an encoded form (Uhh for upper half and
  47. --                       Whhhh for wide characters, as provided by the routine
  48. --                       Store_Encoded_Character, where hh are hex digits for
  49. --                       the character code using lower case a-f). Other
  50. --                       internally generated names use upper case letters
  51. --                       (other than O,Q,U,W) to ensure that they do not clash
  52. --                       with identifier names in the source program. The body
  53. --                       of this package contains a catalog of the use of these
  54. --                       upper case letters.
  55.  
  56. --    Operator symbols   Stored with an initial letter O, and the remainder
  57. --                       of the name is the lower case characters XXX where
  58. --                       the name is Name_Op_XXX, see Snames spec for a full
  59. --                       list of the operator names.
  60.  
  61. --    Character literals Character literals have names that are used only for
  62. --                       debugging and error message purposes. The form is a
  63. --                       upper case Q followed by a single letter, or by a Uxx
  64. --                       or Wxxxx encoding as described for identifiers. The
  65. --                       Set_Character_Literal_Name procedure should be used
  66. --                       to construct these encodings.
  67.  
  68. --    Unit names         Stored with upper case letters folded to lower case,
  69. --                       using Uhh/Whhhh encoding as described for identifiers,
  70. --                       and a %s or %b suffix for specs/bodies. See package
  71. --                       Uname for further details.
  72.  
  73. --    File names         Are stored in the form provided by Osint. Typically
  74. --                       they may include wide character escape sequences and
  75. --                       upper case characters (in non-encoded form). Casing
  76. --                       is also derived from the external environment. Note
  77. --                       that file names provided by Osint must generally be
  78. --                       consistent with the names from Fname.Get_File_Name.
  79.  
  80. --    Other strings      The names table is also used as a convenient storage
  81. --                       location for other variable length strings such as
  82. --                       error messages etc. There are no restrictions on what
  83. --                       characters may appear for such entries.
  84.  
  85. --  Note: the encodings Uhh (upper half characters), Whhhh (wide characters),
  86. --  and Qx (character literal names) are described in the spec, since they
  87. --  are visible throughout the system (e.g. in debugging output). However,
  88. --  no code should depend on these particular encodings, so it should be
  89. --  possible to change the encodings by making changes only to the Namet
  90. --  specification (to change these comments) and the body (which actually
  91. --  implements the encodings).
  92.  
  93. --  The names are hashed so that a given name appears only once in the table,
  94. --  except that names entered with Name_Enter as opposed to Name_Find are
  95. --  omitted from the hash table.
  96.  
  97. --  The first 26 entries in the names table (with Name_Id values in the range
  98. --  First_Name_Id .. First_Name_Id + 25) represent names which are the one
  99. --  character lower case letters in the range a-z, and these names are created
  100. --  and initialized by the Initialize procedure.
  101.  
  102. --  Two values, one of type Int and one of type Byte, are stored with each
  103. --  names table entry and subprograms are provided for setting and retrieving
  104. --  these associated values. The usage of these values is up to the client.
  105. --  In the compiler, the Int field is used to point to a chain of potentially
  106. --  visible entities (see Sem.Ch8 for details), and the Byte field is used
  107. --  to hold the Token_Type value for reserved words (see Sem for details).
  108. --  In the binder, the Byte field is unused, and the Int field is used in
  109. --  various ways depending on the name involved (see binder documentation).
  110.  
  111.    Name_Buffer : String (1 .. System.Parameters.Max_Name_Length);
  112.    --  This buffer is used to set the name to be stored in the table for the
  113.    --  Name_Find call, and to retrieve the name for the Get_Name_String call.
  114.  
  115.    Name_Len : Natural;
  116.    --  Length of name stored in Name_Buffer. Used as an input parameter for
  117.    --  Name_Find, and as an output value by Get_Name_String, or Write_Name.
  118.  
  119.    -----------------
  120.    -- Subprograms --
  121.    -----------------
  122.  
  123.    procedure Finalize;
  124.    --  Called at the end of a use of the Namet package (before a subsequent
  125.    --  call to Initialize). Currently this routine is only used to generate
  126.    --  debugging output.
  127.  
  128.    procedure Get_Name_String (Id : Name_Id);
  129.    --  Get_Name_String is used to retrieve the string associated with an entry
  130.    --  in the names table. The resulting string is stored in Name_Buffer
  131.    --  and Name_Len is set. It is an error to call Get_Name_String with one
  132.    --  of the special name Id values (No_Name, Error_Name, or Child_Name).
  133.  
  134.    procedure Get_Decoded_Name_String (Id : Name_Id);
  135.    --  Same calling sequence an interface as Get_Name_String, except that the
  136.    --  result is decoded, so that upper half characters and wide characters
  137.    --  appear as originally found in the source program text, operators have
  138.    --  their source forms (special characters and enclosed in quotes), and
  139.    --  character literals appear surrounded by apostrophes.
  140.  
  141.    function Get_Name_Table_Byte (Id : Name_Id) return Byte;
  142.    pragma Inline (Get_Name_Table_Byte);
  143.  
  144.    function Get_Name_Table_Info (Id : Name_Id) return Int;
  145.    pragma Inline (Get_Name_Table_Info);
  146.    --  Fetches the Int value associated with the given name
  147.    --  Fetches the Byte value associated with the given name
  148.  
  149.    procedure Initialize;
  150.    --  Initializes the names table, including initializing the first 26
  151.    --  entries in the table (for the 1-character lower case names a-z)
  152.    --  Note that Initialize must not be called if Tree_Read is used.
  153.  
  154.    function Length_Of_Name (Id : Name_Id) return Nat;
  155.    pragma Inline (Length_Of_Name);
  156.    --  Returns length of given name in characters (this is the length of the
  157.    --  encoded name, as stored in the names table, the result is equivalent to
  158.    --  calling Get_Name_String and reading Name_Len, except that a call to
  159.    --  Length_Of_Name does not affect the contents of Name_Len and Name_Buffer.
  160.  
  161.    function Name_Chars_Address return System.Address;
  162.    --  Return starting address of name characters table (used in Back_End
  163.    --  call to Gigi).
  164.  
  165.    function Name_Enter return Name_Id;
  166.    --  Name_Enter has the same calling interface as Name_Find. The difference
  167.    --  is that it does not search the table for an existing match, and also
  168.    --  subsequent Name_Find calls using the same name will not locate the
  169.    --  entry created by this call. Thus multiple calls to Name_Enter with the
  170.    --  same name will create multiple entries in the name table with different
  171.    --  Name_Id values. This is useful in the case of created names, which are
  172.    --  never expected to be looked up. Note: Name_Enter should never be used
  173.    --  for one character names, since these are efficiently located without
  174.    --  hashing by Name_Find in any case.
  175.  
  176.    function Name_Entries_Address return System.Address;
  177.    --  Return starting address of names table. Used in Back_End call to Gigi.
  178.  
  179.    function Name_Entries_Count return Nat;
  180.    --  Return current number of entries in the names table. Used in Back_End
  181.    --  call to Gigi.
  182.  
  183.    function Name_Find return Name_Id;
  184.    --  Name_Find is called with a string stored in Name_Buffer whose length
  185.    --  is in Name_Len (i.e. the characters of the name are in subscript
  186.    --  positions 1 to Name_Len in Name_Buffer). It searches the names
  187.    --  table to see if the string has already been stored. If so the Id of
  188.    --  the existing entry is returned. Otherwise a new entry is created with
  189.    --  its Name_Table_Info field set to zero.
  190.  
  191.    function Is_OK_Internal_Letter (C : Character) return Boolean;
  192.    pragma Inline (Is_OK_Internal_Letter);
  193.    --  Returns true if C is a suitable character for using as a prefix or a
  194.    --  suffix of an internally generated name, i.e. it is an upper case letter
  195.    --  other than one of the ones used for encoding source names (currently
  196.    --  the set of reserved letters is O, Q, U, W)
  197.  
  198.    function Is_Internal_Name (Id : Name_Id) return Boolean;
  199.    --  Returns True if the name is an internal name (i.e. contains a character
  200.    --  for which Is_OK_Internal_Letter is true, or starts or has an invalid
  201.    --  underscore character). This call destroys the value of Name_Len and
  202.    --  Name_Buffer (it loads these as for Get_Name_String).
  203.  
  204.    procedure Reset_Name_Table;
  205.    --  This procedure is used when there are multiple source files to reset
  206.    --  the name table info entries associated with current entries in the
  207.    --  names table. There is no harm in keeping the names entries themselves
  208.    --  from one compilation to another, but we can't keep the entity info,
  209.    --  since this refers to tree nodes, which are destroyed between each
  210.    --  main source file.
  211.  
  212.    procedure Set_Character_Literal_Name (C : Char_Code);
  213.    --  This procedure sets the proper encoded name for the character literal
  214.    --  for the given character code. On return Name_Buffer and Name_Len are
  215.    --  set to reflect the stored name.
  216.  
  217.    procedure Set_Name_Table_Info (Id : Name_Id; Val : Int);
  218.    pragma Inline (Set_Name_Table_Info);
  219.    --  Sets the Int value associated with the given name
  220.  
  221.    procedure Set_Name_Table_Byte (Id : Name_Id; Val : Byte);
  222.    pragma Inline (Set_Name_Table_Byte);
  223.    --  Sets the Byte value associated with the given name
  224.  
  225.    procedure Store_Encoded_Character (C : Char_Code);
  226.    --  Stores given character code at the end of Name_Buffer, updating the
  227.    --  value in Name_Len appropriately. Lower case letters and digits are
  228.    --  stored unchanged. Other 8-bit characters are stored using the Uhh
  229.    --  encoding (hh = hex code), and other 16-bit wide-character values
  230.    --  are stored using the Whhhh (hhhh = hex code) encoding. Note that
  231.    --  this procedure does not fold upper case letters (they are stored
  232.    --  using the Uhh encoding). If folding is required, it must be done
  233.    --  by the caller prior to the call.
  234.  
  235.    procedure Tree_Read;
  236.    --  Initializes internal tables from current tree file using Tree_Read.
  237.    --  Note that Initialize should not be called if Tree_Read is used.
  238.    --  Tree_Read includes all necessary initialization.
  239.  
  240.    procedure Tree_Write;
  241.    --  Writes out internal tables to current tree file using Tree_Write
  242.  
  243.    procedure Write_Name (Id : Name_Id);
  244.    --  Write_Name writes the characters of the specified name using the
  245.    --  standard output procedures in package Output. No end of line is
  246.    --  written, just the characters of the name. On return Name_Buffer and
  247.    --  Name_Len are set as for a call to Get_Name_String. The name is written
  248.    --  in encoded form (i.e. including Uhh, Whhh, Qx, _op as they appear in
  249.    --  the name table). If Id is Error_Name, or No_Name, no text is output.
  250.  
  251.    procedure Write_Name_Decoded (Id : Name_Id);
  252.    --  Like Write_Name, except that the name written is the decoded name, as
  253.    --  described for Name_Decode, and the resulting value stored in Name_Len
  254.    --  and Name_Buffer is the decoded name.
  255.  
  256. end Namet;
  257.