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 / par.adb < prev    next >
Text File  |  1996-09-28  |  50KB  |  1,093 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                                  P A R                                   --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.88 $                             --
  10. --                                                                          --
  11. --           Copyright (c) 1992,1993,1994 NYU, All Rights Reserved          --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. with Atree;    use Atree;
  26. with Casing;   use Casing;
  27. with Csets;    use Csets;
  28. with Debug;    use Debug;
  29. with Elists;   use Elists;
  30. with Errout;   use Errout;
  31. with Features; use Features;
  32. with Fname;    use Fname;
  33. with Lib;      use Lib;
  34. with Namet;    use Namet;
  35. with Nlists;   use Nlists;
  36. with Nmake;    use Nmake;
  37. with Opt;      use Opt;
  38. with Output;   use Output;
  39. with Scans;    use Scans;
  40. with Scn;      use Scn;
  41. with Sinput;   use Sinput;
  42. with Sinfo;    use Sinfo;
  43. with Snames;   use Snames;
  44. with Style;
  45. with Table;
  46. with Tbuild;   use Tbuild;
  47. with Types;    use Types;
  48.  
  49. procedure Par is
  50.  
  51.    Num_Library_Units : Natural := 0;
  52.    --  Count number of units parsed (relevant only in syntax check only mode,
  53.    --  since in semantics check mode only a single unit is permitted anyway)
  54.  
  55.    Unit_Node : Node_Id;
  56.    --  Stores compilation unit node for current unit
  57.  
  58.    Save_Ada_83_Mode : constant Boolean := Ada_83;
  59.    --  Saves state of Ada 83 mode switch for restore on exit (since it may
  60.    --  get reset by occurrence of the Ada_83 or Ada_95 pragmas).
  61.  
  62.    Save_Features_On : constant Boolean := Features_On;
  63.    --  Saves state of Features_On flag for restore on exit (so that a recursive
  64.    --  call on the compiler does not disturb the proper setting of Features_On)
  65.  
  66.    --------------------
  67.    -- Error Recovery --
  68.    --------------------
  69.  
  70.    --  When an error is encountered, a call is made to one of the Error_Msg
  71.    --  routines to record the error. If the syntax scan is not derailed by the
  72.    --  error (e.g. a complaint that logical operators are inconsistent in an
  73.    --  EXPRESSION), then control returns from the Error_Msg call, and the
  74.    --  parse continues unimpeded.
  75.  
  76.    --  If on the other hand, the Error_Msg represents a situation from which
  77.    --  the parser cannot recover locally, the exception Error_Resync is raised
  78.    --  immediately after the call to Error_Msg. Handlers for Error_Resync
  79.    --  are located at strategic points to resynchronize the parse. For example,
  80.    --  when an error occurs in a statement, the handler skips to the next
  81.    --  semicolon and continues the scan from there.
  82.  
  83.    --  Each parsing procedure contains a note with the heading "Error recovery"
  84.    --  which shows if it can propagate the Error_Resync exception. In order
  85.    --  not to propagate the exception, a procedure must either contain its own
  86.    --  handler for this exception, or it must not call any other routines which
  87.    --  propagate the exception.
  88.  
  89.    --  Note: the arrangement of Error_Resync handlers is such that it should
  90.    --  never be possible to transfer control through a procedure which made
  91.    --  an entry in the scope stack, invalidating the contents of the stack.
  92.  
  93.    Error_Resync : exception;
  94.    --  Exception raised on error that is not handled locally, see above.
  95.  
  96.    Last_Resync_Point : Source_Ptr;
  97.    --  The resynchronization routines in Par.Sync run a risk of getting
  98.    --  stuck in an infinite loop if they do not skip a token, and the caller
  99.    --  keeps repeating the same resync call. On the other hand, if they skip
  100.    --  a token unconditionally, some recovery opportunities are missed. The
  101.    --  variable Last_Resync_Point records the token location previously set
  102.    --  by a Resync call, and if a subsequent Resync call occurs at the same
  103.    --  location, then the Resync routine does guarantee to skip a token.
  104.  
  105.    --------------------------------------------
  106.    -- Handling Semicolon Used in Place of IS --
  107.    --------------------------------------------
  108.  
  109.    --  The following global variables are used in handling the error situation
  110.    --  of using a semicolon in place of IS in a subprogram declaration as in:
  111.  
  112.    --    procedure X (Y : Integer);
  113.    --       Q : Integer;
  114.    --    begin
  115.    --       ...
  116.    --    end;
  117.  
  118.    --  The two contexts in which this can appear are at the outer level, and
  119.    --  within a declarative region. At the outer level, we know something is
  120.    --  wrong as soon as we see the Q (or begin, if there are no declarations),
  121.    --  and we can immediately decide that the semicolon should have been IS.
  122.  
  123.    --  The situation in a declarative region is more complex. The declaration
  124.    --  of Q could belong to the outer region, and we do not know that we have
  125.    --  an error until we hit the begin. It is still not clear at this point
  126.    --  from a syntactic point of view that something is wrong, because the
  127.    --  begin could belong to the enclosing subprogram or package. However, we
  128.    --  can incorporate a bit of semantic knowledge and note that the body of
  129.    --  X is missing, so we definitely DO have an error. We diagnose this error
  130.    --  as semicolon in place of IS on the subprogram line.
  131.  
  132.    --  There are two styles for this diagnostic. If the begin immediately
  133.    --  follows the semicolon, then we can place a flag (IS expected) right
  134.    --  on the semicolon. Otherwise we do not detect the error until we hit
  135.    --  the begin which refers back to the line with the semicolon.
  136.  
  137.    --  To control the process in the second case, the following global
  138.    --  variables are set to indicate that we have a subprogram declaration
  139.    --  whose body is required and has not yet been found. The prefix SIS
  140.    --  stands for "Subprogram IS" handling.
  141.  
  142.    SIS_Entry_Active : Boolean;
  143.    --  Set True to indicate that an entry is active (i.e. that a subprogram
  144.    --  declaration has been encountered, and no body for this subprogram has
  145.    --  been encountered). The remaining fields are valid only if this is True.
  146.  
  147.    SIS_Labl : Node_Id;
  148.    --  Subprogram designator
  149.  
  150.    SIS_Sloc : Source_Ptr;
  151.    --  Source location of FUNCTION/PROCEDURE keyword
  152.  
  153.    SIS_Ecol : Column_Number;
  154.    --  Column number of FUNCTION/PROCEDURE keyword
  155.  
  156.    SIS_Semicolon_Sloc : Source_Ptr;
  157.    --  Source location of semicolon at end of subprogram declaration
  158.  
  159.    SIS_Declaration_Node : Node_Id;
  160.    --  Pointer to tree node for subprogram declaration
  161.  
  162.    SIS_Missing_Semicolon_Message : Error_Msg_Id;
  163.    --  Used to save message ID of missing semicolon message (which will be
  164.    --  modified to missing IS if necessary). Set to No_Error_Msg in the
  165.    --  normal (non-error) case.
  166.  
  167.    --  Five things can happen to an active SIS entry
  168.  
  169.    --   1. If a BEGIN is encountered with an SIS entry active, then we have
  170.    --   exactly the situation in which we know the body of the subprogram is
  171.    --   missing. After posting an error message, we change the spec to a body,
  172.    --   rechaining the declarations that intervened between the spec and BEGIN.
  173.  
  174.    --   2. Another subprogram declaration or body is encountered. In this
  175.    --   case the entry gets overwritten with the information for the new
  176.    --   subprogram declaration. We don't catch some nested cases this way,
  177.    --   but it doesn't seem worth the effort.
  178.  
  179.    --   3. A nested declarative region (e.g. package declaration or package
  180.    --   body) is encountered. The SIS active indication is reset at the start
  181.    --   of such a nested region. Again, like case 2, this causes us to miss
  182.    --   some nested cases, but it doesn't seen worth the effort to stack and
  183.    --   unstack the SIS information. Maybe we will reconsider this if we ever
  184.    --   get a complaint about a missed case :-)
  185.  
  186.    --   4. We encounter a valid pragma INTERFACE or IMPORT that effectively
  187.    --   supplies the missing body. In this case we reset the entry.
  188.  
  189.    --   5. We encounter the end of the declarative region without encoutering
  190.    --   a BEGIN first. In this situation we simply reset the entry. We know
  191.    --   that there is a missing body, but it seems more reasonable to let the
  192.    --   later semantic checking discover this.
  193.  
  194.    --------------------------------------------
  195.    -- Handling IS Used in Place of Semicolon --
  196.    --------------------------------------------
  197.  
  198.    --  This is a somewhat trickier situation, and we can't catch it in all
  199.    --  cases, but we do our best to detect common situations resulting from
  200.    --  a "cut and paste" operation which forgets to change the IS to semicolon.
  201.    --  Consider the following example:
  202.  
  203.    --    package body X is
  204.    --      procedure A;
  205.    --      procedure B is
  206.    --      procedure C;
  207.    --      ...
  208.    --      procedure D is
  209.    --      begin
  210.    --         ...
  211.    --      end;
  212.    --    begin
  213.    --      ...
  214.    --    end;
  215.  
  216.    --  The trouble is that the section of text from PROCEDURE B through END;
  217.    --  consitutes a valid procedure body, and the danger is that we find out
  218.    --  far too late that something is wrong (indeed most compilers will behave
  219.    --  uncomfortably on the above example).
  220.  
  221.    --  We have two approaches to helping to control this situation. First we
  222.    --  make every attempt to avoid swallowing the last END; if we can be
  223.    --  sure that some error will result from doing so. In particular, we won't
  224.    --  accept the END; unless it is exactly correct (in particular it must not
  225.    --  have incorrect name tokens), and we won't accept it if it is immediately
  226.    --  followed by end of file, WITH or SEPARATE (all tokens that unmistakeably
  227.    --  signal the start of a compilation unit, and which therefore allow us to
  228.    --  reserve the END; for the outer level.) For more details on this aspect
  229.    --  of the handling, see package Par.Endh.
  230.  
  231.    --  If we can avoid eating up the END; then the result in the absense of
  232.    --  any additional steps would be to post a missing END referring back to
  233.    --  the subprogram with the bogus IS. Similarly, if the enclosing package
  234.    --  has no BEGIN, then the result is a missing BEGIN message, which again
  235.    --  refers back to the subprogram header.
  236.  
  237.    --  Such an error message is not too bad (it's already a big improvement
  238.    --  over what many parsers do), but it's not ideal, because the declarations
  239.    --  following the IS have been absorbed into the wrong scope. In the above
  240.    --  case, this could result for example in a bogus complaint that the body
  241.    --  of D was missing from the package.
  242.  
  243.    --  To catch at least some of these cases, we take the following additional
  244.    --  steps. First, a subprogram body is marked as having a suspicious IS if
  245.    --  the declaration line is followed by a line which starts with a symbol
  246.    --  that can start a declaration in the same column, or to the left of the
  247.    --  column in which the FUNCTION or PROCEDURE starts (normal style is to
  248.    --  indent any declarations which really belong a subprogram). If such a
  249.    --  subprogram encounters a missing BEGIN or missing END, then we decide
  250.    --  that the IS should have been a semicolon, and the subprogram body node
  251.    --  is marked (by setting the Bad_Is_Detected flag true.
  252.  
  253.    --  The processing for a declarative part checks to see if the last
  254.    --  declaration scanned is marked in this way, and if it is, the tree
  255.    --  is modified to reflect the IS being interpreted as a semicolon.
  256.  
  257.    ---------------------------------------------------
  258.    -- Parser Type Definitions and Control Variables --
  259.    ---------------------------------------------------
  260.  
  261.    --  The following variable and associated type declaration are used by the
  262.    --  expression parsing routines to return more detailed information about
  263.    --  the categorization of a parsed expression.
  264.  
  265.    type Expr_Form_Type is (
  266.       EF_Simple_Name,  -- Simple name, i.e. possibly qualified identifier
  267.       EF_Name,         -- Simple expression which could also be a name
  268.       EF_Simple,       -- Simple expression which is not call or name
  269.       EF_Non_Simple);  -- Expression that is not a simple expression
  270.  
  271.    Expr_Form : Expr_Form_Type;
  272.  
  273.    --  The following type is used for calls to P_Subprogram, P_Package, P_Task,
  274.    --  P_Protected to indicate which of several possibilities is acceptable.
  275.  
  276.    type Pf_Rec is record
  277.       Spcn : Boolean;                  -- True if specification OK
  278.       Decl : Boolean;                  -- True if declaration OK
  279.       Gins : Boolean;                  -- True if generic instantiation OK
  280.       Pbod : Boolean;                  -- True if proper body OK
  281.       Rnam : Boolean;                  -- True if renaming declaration OK
  282.       Stub : Boolean;                  -- True if body stub OK
  283.       Fil1 : Boolean;                  -- Filler to fill to 8 bits
  284.       Fil2 : Boolean;                  -- Filler to fill to 8 bits
  285.    end record;
  286.    pragma Pack (Pf_Rec);
  287.  
  288.    function T return Boolean renames True;
  289.    function F return Boolean renames False;
  290.  
  291.    Pf_Decl_Gins_Pbod_Rnam_Stub : constant Pf_Rec :=
  292.                                              Pf_Rec'(F, T, T, T, T, T, F, F);
  293.    Pf_Decl                     : constant Pf_Rec :=
  294.                                              Pf_Rec'(F, T, F, F, F, F, F, F);
  295.    Pf_Decl_Gins_Pbod_Rnam      : constant Pf_Rec :=
  296.                                              Pf_Rec'(F, T, T, T, T, F, F, F);
  297.    Pf_Pbod                     : constant Pf_Rec :=
  298.                                              Pf_Rec'(F, F, F, T, F, F, F, F);
  299.    Pf_Spcn                     : constant Pf_Rec :=
  300.                                              Pf_Rec'(T, F, F, F, F, F, F, F);
  301.    --  The above are the only allowed values of Pf_Rec arguments
  302.  
  303.    type SS_Rec is record
  304.       Eftm : Boolean;      -- ELSIF can terminate sequence
  305.       Eltm : Boolean;      -- ELSE can terminate sequence
  306.       Extm : Boolean;      -- EXCEPTION can terminate sequence
  307.       Ortm : Boolean;      -- OR can terminate sequence
  308.       Sreq : Boolean;      -- at least one statement required
  309.       Tatm : Boolean;      -- THEN ABORT can terminate sequence
  310.       Whtm : Boolean;      -- WHEN can terminate sequence
  311.       Unco : Boolean;      -- Unconditional terminate after one statement
  312.    end record;
  313.    pragma Pack (SS_Rec);
  314.  
  315.    SS_Eftm_Eltm_Sreq : constant SS_Rec := SS_Rec'(T, T, F, F, T, F, F, F);
  316.    SS_Eltm           : constant SS_Rec := SS_Rec'(F, T, F, F, F, F, F, F);
  317.    SS_Eltm_Ortm      : constant SS_Rec := SS_Rec'(F, T, F, T, F, F, F, F);
  318.    SS_Eltm_Ortm_Tatm : constant SS_Rec := SS_Rec'(F, T, F, T, F, T, F, F);
  319.    SS_Extm_Sreq      : constant SS_Rec := SS_Rec'(F, F, T, F, T, F, F, F);
  320.    SS_None           : constant SS_Rec := SS_Rec'(F, F, F, F, F, F, F, F);
  321.    SS_Ortm           : constant SS_Rec := SS_Rec'(F, F, F, T, F, F, F, F);
  322.    SS_Ortm_Sreq      : constant SS_Rec := SS_Rec'(F, F, F, T, T, F, F, F);
  323.    SS_Sreq           : constant SS_Rec := SS_Rec'(F, F, F, F, T, F, F, F);
  324.    SS_Sreq_Whtm      : constant SS_Rec := SS_Rec'(F, F, F, F, T, F, T, F);
  325.    SS_Whtm           : constant SS_Rec := SS_Rec'(F, F, F, F, F, F, T, F);
  326.    SS_Unco           : constant SS_Rec := SS_Rec'(F, F, F, F, F, F, F, T);
  327.  
  328.    type End_Action_Type is (
  329.    --  Type used to describe the result of the Pop_End_Context call
  330.  
  331.       Accept_As_Scanned,
  332.       --  Current end sequence is entirely c correct. In this case Token and
  333.       --  the scan pointer are left pointing past the end sequence (i.e. they
  334.       --  are unchanged from the values set on entry to Pop_End_Context).
  335.  
  336.       Insert_And_Accept,
  337.       --  Current end sequence is to be left in place to satisfy some outer
  338.       --  scope. Token and the scan pointer are set to point to the end
  339.       --  token, and should be left there. A message has been generated
  340.       --  indicating a missing end sequence. This status is also used for
  341.       --  the case when no end token is present.
  342.  
  343.       Skip_And_Accept,
  344.       --  The end sequence is incorrect (and an error message has been
  345.       --  posted), but it will still be accepted. In this case Token and
  346.       --  the scan pointer point back to the end token, and the caller
  347.       --  should skip past the end sequence before proceeding.
  348.  
  349.       Skip_And_Reject);
  350.       --  The end sequence is judged to belong to an unrecognized inner
  351.       --  scope. An appropriate message has been issued and the caller
  352.       --  should skip past the end sequence and then proceed as though
  353.       --  no end sequence had been encountered.
  354.  
  355.    End_Action : End_Action_Type;
  356.    --  The variable set by Pop_End_Context call showing which of the four
  357.    --  decisions described above is judged the best.
  358.  
  359.    Label_List : Elist_Id;
  360.    --  List of label nodes for labels appearing in the current compilation.
  361.    --  Used by Par.Labl to construct the corresponding implicit declarations.
  362.  
  363.    -----------------
  364.    -- Scope Table --
  365.    -----------------
  366.  
  367.    --  The scope table, also referred to as the scope stack, is used to
  368.    --  record the current scope context. It is organized as a stack, with
  369.    --  inner nested entries corresponding to higher entries on the stack.
  370.    --  An entry is made when the parser encounters the opening of a nested
  371.    --  construct (such as a record, task, package etc.), and then package
  372.    --  Par.Endh uses this stack to deal with END lines (including properly
  373.    --  dealing with END nesting errors).
  374.  
  375.    type SS_End_Type is
  376.    --  Type of end entry required for this scope. The last two entries are
  377.    --  used only in the subprogram body case to mark the case of a suspicious
  378.    --  IS, or a bad IS (i.e. suspicions confirmed by missing BEGIN or END).
  379.    --  See separate section on dealing with IS used in place of semicolon.
  380.    --  Note that for many purposes E_Name, E_Suspicious_Is and E_Bad_Is are
  381.    --  treated the same (E_Suspicious_Is and E_Bad_Is are simply special cases
  382.    --  of E_Name). They are placed at the end of the enumeration so that a
  383.    --  test for >= E_Name catches all three cases efficiently.
  384.  
  385.       (E_Dummy,           -- dummy entry at outer level
  386.        E_Case,            -- END CASE;
  387.        E_If,              -- END IF;
  388.        E_Loop,            -- END LOOP;
  389.        E_Record,          -- END RECORD;
  390.        E_Select,          -- END SELECT;
  391.        E_Name,            -- END [name];
  392.        E_Suspicious_Is,   -- END [name]; (case of suspicious IS)
  393.        E_Bad_Is);         -- END [name]; (case of bad IS)
  394.  
  395.    type Scope_Table_Entry is record
  396.       Etyp : SS_End_Type;
  397.       Lreq : Boolean;
  398.       Ecol : Column_Number;
  399.       Labl : Node_Id;
  400.       Decl : List_Id;
  401.       Sloc : Source_Ptr;
  402.       S_Is : Source_Ptr;
  403.    end record;
  404.    --  Single entry in the table. The fields are used as follows:
  405.  
  406.    --  The Lreq field is a flag indicating whether the label, if present,
  407.    --  is required to appear on the end line. It is referenced only in the
  408.    --  case of Etyp = E_Name or E_Suspicious_Is where the name may or may not
  409.    --  be required (yes for labeled block, no in other cases). Note that for
  410.    --  all cases except begin, the question of whether a label is required
  411.    --  can be determined from the other fields (for loop, it is required if
  412.    --  it is present, and for the other constructs it is never required or
  413.    --  allowed).
  414.  
  415.    --  The Ecol field contains the absolute column number (with tabs expanded)
  416.    --  of the expected column of the end assuming normal Ada indentation usage.
  417.    --  If the RM_Column_Check mode is set, this value is used in assessing the
  418.    --  syntactic correctness of various constructs. Otherwise it is used only
  419.    --  to control heuristic error recovery actions.
  420.  
  421.    --  The Labl field is used only for the LOOP and BEGIN cases, and is the
  422.    --  Node_Id value of the label name. For all cases except child units,
  423.    --  this value is an entity whose Chars field contains the name pointer
  424.    --  that identifies the label uniquely. For the child unit case the Labl
  425.    --  field references an N_Defining_Program_Unit_Name node for the name.
  426.    --  For cases other than LOOP or BEGIN, the Label field is set to Error,
  427.    --  indicating that it is an error to have a label on the end line.
  428.  
  429.    --  The Decl field points to the list of declarations (i.e. the declarative
  430.    --  part) associated with this construct. It is set only in the END [name]
  431.    --  cases, and is set to No_List for all other cases which do not have a
  432.    --  declarative unit associated with them. This is used for determining the
  433.    --  proper location for implicit label declarations.
  434.  
  435.    --  Sloc is the source location of the opening token of the construct. This
  436.    --  is used to refer back to this line in error messages (such as missing
  437.    --  or incorrect end lines). The Sloc field is not used, and is not set, if
  438.    --  a label is present (the Labl field provides the text name of the label
  439.    --  in this case, which is fine for error messages).
  440.  
  441.    --  S_Is is relevant only if Etyp is set to E_Suspicious_Is or E_Bad_Is.
  442.    --  It records the location of the IS that is considered to be suspicious.
  443.  
  444.    --  The following declares the scope table itself. The Last field is the
  445.    --  stack pointer, so that Scope.Table (Scope.Last) is the top entry. The
  446.    --  oldest entry, at Scope_Stack (0), is a dummy entry with Etyp set to
  447.    --  E_Dummy, and the other fields undefined. This dummy entry ensures that
  448.    --  Scope_Stack (Scope_Stack_Ptr).Etyp can always be tested, and that the
  449.    --  scope stack pointer is always in range.
  450.  
  451.    package Scope is new Table (
  452.      Table_Component_Type => Scope_Table_Entry,
  453.      Table_Index_Type     => Int,
  454.      Table_Low_Bound      => 0,
  455.      Table_Initial        => 50,
  456.      Table_Increment      => 100,
  457.      Table_Name           => "Scope");
  458.  
  459.    ---------------------------------
  460.    -- Parsing Routines by Chapter --
  461.    ---------------------------------
  462.  
  463.    --  Uncommented declarations in this section simply parse the construct
  464.    --  corresponding to their name, and return an ID value for the Node or
  465.    --  List that is created.
  466.  
  467.    package Ch2 is
  468.       function P_Identifier                           return Node_Id;
  469.       function P_Pragma                               return Node_Id;
  470.  
  471.       procedure P_Pragmas_Misplaced;
  472.       --  Skips misplaced pragmas with a complaint
  473.  
  474.       procedure P_Pragmas_Opt (List : List_Id);
  475.       --  Parses optional pragmas and appends them to the List
  476.    end Ch2;
  477.  
  478.    package Ch3 is
  479.       Missing_Begin_Msg : Error_Msg_Id;
  480.       --  This variable is set by a call to P_Declarative_Part. Normaly it
  481.       --  is set to No_Error_Msg, indicating that no special processing is
  482.       --  required by the caller. The special case arises when a statement
  483.       --  is found in the sequence of declarations. In this case the Id of
  484.       --  the message issued ("declaration expected") is preserved in this
  485.       --  variable, then the caller can change it to an appropriate missing
  486.       --  begin message if indeed the BEGIN is missing.
  487.  
  488.       function P_Access_Definition                    return Node_Id;
  489.       function P_Access_Type_Definition               return Node_Id;
  490.       function P_Array_Type_Definition                return Node_Id;
  491.       function P_Basic_Declarative_Items              return List_Id;
  492.       function P_Constraint_Opt                       return Node_Id;
  493.       function P_Declarative_Part                     return List_Id;
  494.       function P_Defining_Identifier                  return Node_Id;
  495.       function P_Discrete_Choice_List                 return List_Id;
  496.       function P_Discrete_Range                       return Node_Id;
  497.       function P_Discrete_Subtype_Definition          return Node_Id;
  498.       function P_Known_Discriminant_Part_Opt          return List_Id;
  499.       function P_Signed_Integer_Type_Definition       return Node_Id;
  500.       function P_Range                                return Node_Id;
  501.       function P_Range_Or_Subtype_Mark                return Node_Id;
  502.       function P_Range_Constraint                     return Node_Id;
  503.       function P_Record_Definition                    return Node_Id;
  504.       function P_Subtype_Indication                   return Node_Id;
  505.       function P_Subtype_Mark                         return Node_Id;
  506.       function P_Subtype_Mark_Resync                  return Node_Id;
  507.       function P_Unknown_Discriminant_Part_Opt        return Boolean;
  508.  
  509.       procedure P_Component_Items (Decls : List_Id);
  510.       --  Scan out one or more component items and append them to the
  511.       --  given list. Only scans out more than one declaration in the
  512.       --  case where the source has a single declaration with multiple
  513.       --  defining identifiers.
  514.  
  515.       function Init_Expr_Opt (P : Boolean := False) return Node_Id;
  516.       --  If an initialization expression is present (:= expression), then
  517.       --  it is scanned out and returned, otherwise Empty is returned if no
  518.       --  initialization expression is present. This procedure also handles
  519.       --  certain common error cases cleanly. The parameter P indicates if
  520.       --  a right paren can follow the expression (default = no right paren
  521.       --  allowed).
  522.  
  523.       function P_Subtype_Indication (Subtype_Mark : Node_Id) return Node_Id;
  524.       --  This version of P_Subtype_Indication is called when the caller has
  525.       --  already scanned out the subtype mark which is passed as a parameter.
  526.  
  527.       function P_Subtype_Mark_Attribute (Type_Node : Node_Id) return Node_Id;
  528.       --  Parse a subtype mark attribute. The caller has already parsed the
  529.       --  subtype mark, which is passed in as the argument, and has checked
  530.       --  that the current token is apostrophe.
  531.  
  532.    end Ch3;
  533.  
  534.    package Ch4 is
  535.       function P_Aggregate                            return Node_Id;
  536.       function P_Expression                           return Node_Id;
  537.       function P_Expression_No_Right_Paren            return Node_Id;
  538.       function P_Function_Name                        return Node_Id;
  539.       function P_Name                                 return Node_Id;
  540.       function P_Qualified_Simple_Name                return Node_Id;
  541.       function P_Qualified_Simple_Name_Resync         return Node_Id;
  542.       function P_Simple_Expression                    return Node_Id;
  543.  
  544.       function P_Qualified_Expression
  545.         (Subtype_Mark : Node_Id)
  546.          return         Node_Id;
  547.       --  This routine scans out a qualified expression when the caller has
  548.       --  already scanned out the name and apostrophe of the construct.
  549.  
  550.       function P_Range_Attribute_Reference
  551.         (Prefix_Node : Node_Id)
  552.          return        Node_Id;
  553.       --  Scan a range attribute reference. The caller has scanned out the
  554.       --  prefix. The current token is known to be an apostrophe and the
  555.       --  following token is known to be RANGE.
  556.  
  557.    end Ch4;
  558.  
  559.    package Ch5 is
  560.  
  561.       function P_Statement_Name (Name_Node : Node_Id) return Node_Id;
  562.       --  Given a node representing a name (which is a call), converts it
  563.       --  to the syntactically corresponding procedure call statement.
  564.  
  565.       function P_Sequence_Of_Statements (SS_Flags : SS_Rec) return List_Id;
  566.       --  The argument indicates the acceptable termination tokens.
  567.       --  See body in Par.Ch5 for details of the use of this parameter.
  568.  
  569.       procedure Parse_Decls_Begin_End (Parent : Node_Id);
  570.       --  Parses declarations and handled statement sequence, setting
  571.       --  fields of Parent node appropriately.
  572.  
  573.    end Ch5;
  574.  
  575.    package Ch6 is
  576.       function P_Designator                           return Node_Id;
  577.       function P_Defining_Program_Unit_Name           return Node_Id;
  578.       function P_Formal_Part                          return List_Id;
  579.       function P_Parameter_Profile                    return List_Id;
  580.       function P_Return_Statement                     return Node_Id;
  581.       function P_Subprogram_Specification             return Node_Id;
  582.  
  583.       procedure P_Mode (Node : Node_Id);
  584.       --  Sets In_Present and/or Out_Present flags in Node scanning past
  585.       --  IN, OUT or IN OUT tokens in the source.
  586.  
  587.       function P_Subprogram (Pf_Flags : Pf_Rec)       return Node_Id;
  588.       --  Scans out any construct starting with either of the keywords
  589.       --  PROCEDURE or FUNCTION. The parameter indicates which possible
  590.       --  possible kinds of construct (body, spec, instantiation etc.)
  591.       --  are permissible in the current context.
  592.  
  593.    end Ch6;
  594.  
  595.    package Ch7 is
  596.       function P_Package (Pf_Flags : Pf_Rec) return Node_Id;
  597.       --  Scans out any construct starting with the keyword PACKAGE. The
  598.       --  parameter indicates which possible kinds of construct (body, spec,
  599.       --  instantiation etc.) are permissible in the current context.
  600.    end Ch7;
  601.  
  602.    package Ch8 is
  603.       function P_Use_Clause                           return Node_Id;
  604.    end Ch8;
  605.  
  606.    package Ch9 is
  607.       function P_Abort_Statement                      return Node_Id;
  608.       function P_Abortable_Part                       return Node_Id;
  609.       function P_Accept_Statement                     return Node_Id;
  610.       function P_Delay_Statement                      return Node_Id;
  611.       function P_Entry_Body                           return Node_Id;
  612.       function P_Protected                            return Node_Id;
  613.       function P_Requeue_Statement                    return Node_Id;
  614.       function P_Select_Statement                     return Node_Id;
  615.       function P_Task                                 return Node_Id;
  616.       function P_Terminate_Alternative                return Node_Id;
  617.    end Ch9;
  618.  
  619.    package Ch10 is
  620.       function P_Compilation_Unit                     return Node_Id;
  621.    end Ch10;
  622.  
  623.    package Ch11 is
  624.       function P_Handled_Sequence_Of_Statements       return Node_Id;
  625.       function P_Raise_Statement                      return Node_Id;
  626.  
  627.       function Parse_Exception_Handlers               return List_Id;
  628.       --  Parses the partial construct EXCEPTION followed by a list of
  629.       --  exception handlers which appears in a number of productions,
  630.       --  and returns the list of exception handlers.
  631.  
  632.    end Ch11;
  633.  
  634.    package Ch12 is
  635.       function P_Generic                              return Node_Id;
  636.       function P_Generic_Actual_Part_Opt              return List_Id;
  637.    end Ch12;
  638.  
  639.    package Ch13 is
  640.       function P_Representation_Clause                return Node_Id;
  641.  
  642.       function P_Code_Statement (Subtype_Mark : Node_Id) return Node_Id;
  643.       --  Function to parse a code statement. The caller has scanned out
  644.       --  the name to be used as the subtype mark (but has not checked that
  645.       --  it is suitable for use as a subtype mark, i.e. is either an
  646.       --  identifier or a selected component). The current token is an
  647.       --  apostrophe and the following token is either a left paren or
  648.       --  RANGE (the latter being an error to be caught by P_Code_Statement.
  649.    end Ch13;
  650.  
  651.    --  Note: the parsing for annexe I features (i.e. obsolescent features)
  652.    --  is found in the logical section where these features would be if
  653.    --  they were not obsolescent. In particular:
  654.  
  655.    --    Delta constraint is parsed by P_Delta_Constraint (3.5.9)
  656.    --    At clause is parsed by P_At_Clause (13.1)
  657.    --    Mod clause is parsed by P_Mod_Clause (13.5.1)
  658.  
  659.    ------------------
  660.    -- End Handling --
  661.    ------------------
  662.  
  663.    --  Routines for handling end lines, including scope recovery
  664.  
  665.    package Endh is
  666.  
  667.       function Check_End return Boolean;
  668.       --  Called when an end sequence is required. In the absence of an error
  669.       --  situation, Token contains Tok_End on entry, but in a missing end
  670.       --  case, this may not be the case. Pop_End_Context is used to determine
  671.       --  the appropriate action to be taken. The returned result is True if
  672.       --  an End sequence was encountered and False if no End sequence was
  673.       --  present. This occurs if the END keyword encountered was determined
  674.       --  to be improper and deleted (i.e. Pop_End_Context set End_Action to
  675.       --  Skip_And_Reject). Note that the END sequence includes a semicolon,
  676.       --  except in the case of END RECORD, where a semicolon follows the END
  677.       --  RECORD, but is not part of the record type definition itself.
  678.  
  679.       procedure End_Skip;
  680.       --  Skip past an end sequence. On entry Token contains Tok_End, and we
  681.       --  we know that the end sequence is syntactically incorrect, and that
  682.       --  an appropriate error message has already been posted. The mission is
  683.       --  simply to position the scan pointer to be the best guess of the
  684.       --  position after the end sequence. We do not issue any additional
  685.       --  error messages while carrying this out.
  686.  
  687.       procedure End_Statements;
  688.       --  Called when an end is required or expected to terminate a sequence
  689.       --  of statements. The caller has already made an appropriate entry in
  690.       --  the Scope.Table to describe the expected form of the end. This can
  691.       --  only be used in cases where the only appropriate terminator is end.
  692.  
  693.       procedure Pop_End_Context;
  694.       --  Pop_End_Context is called after processing a construct, to pop
  695.       --  the top entry off the end stack. It decides on the appropriate action
  696.       --  to take, signalling the result by setting End_Action as described in
  697.       --  the global variable section.
  698.  
  699.    end Endh;
  700.  
  701.    ------------------------------------
  702.    -- Resynchronization After Errors --
  703.    ------------------------------------
  704.  
  705.    --  These procedures are used to resynchronize after errors. Following an
  706.    --  error which is not immediately locally recoverable, the exception
  707.    --  Error_Resync is raised. The handler for Error_Resync typically calls
  708.    --  one of these recovery procedures to resynchronize the source position
  709.    --  to a point from which parsing can be restarted.
  710.  
  711.    --  Note: these procedures output an information message that tokens are
  712.    --  being skipped, but this message is output only if the option for
  713.    --  Multiple_Errors_Per_Line is set in Options.
  714.  
  715.    package Sync is
  716.  
  717.       procedure Resync_Choice;
  718.       --  Used if an error occurs scanning a choice. The scan pointer is
  719.       --  advanced to the next vertical bar, arrow, or semicolon, whichever
  720.       --  comes first. We also quit if we encounter an end of file.
  721.  
  722.       procedure Resync_Expression;
  723.       --  Used if an error is detected during the parsing of an expression.
  724.       --  It skips past tokens until either a token which cannot be part of
  725.       --  an expression is encountered (an expression terminator), or if a
  726.       --  comma or right parenthesis or vertical bar is encountered at the
  727.       --  current parenthesis level (a parenthesis level counter is maintained
  728.       --  to carry out this test).
  729.  
  730.       procedure Resync_Past_Right_Paren_Or_EOL;
  731.       --  Used to skip a junk list of items enclosed in parentheses which are
  732.       --  expected to lie on the current line. Tokens are skipped until a
  733.       --  right paren is skipped, or until end of line, whichever is first.
  734.  
  735.       procedure Resync_Past_Semicolon;
  736.       --  Used if an error occurs while scanning a sequence of declarations.
  737.       --  The scan pointer is positioned past the next semicolon and the scan
  738.       --  resumes. The scan is also resumed on encountering a token which
  739.       --  starts a declaration (but we make sure to skip at least one token
  740.       --  in this case, to avoid getting stuck in a loop).
  741.  
  742.       procedure Resync_Past_Semicolon_Or_To_Loop_Or_Then;
  743.       --  Used if an error occurs while scanning a sequence of statements.
  744.       --  The scan pointer is positioned past the next semicolon, or to the
  745.       --  next occurrence of either then or loop, and the scan resumes.
  746.  
  747.       procedure Resync_To_When;
  748.       --  Used when an error occurs scanning an entry index specification.
  749.       --  The scan pointer is positioned to the next WHEN (or to IS or
  750.       --  semicolon if either of these appear before WHEN, indicating
  751.       --  another error has occurred).
  752.  
  753.       procedure Resync_Semicolon_List;
  754.       --  Used if an error occurs while scanning a parenthesized list of items
  755.       --  separated by semicolons. The scan pointer is advanced to the next
  756.       --  semicolon or right parenthesis at the outer parenthesis level, or
  757.       --  to the next is or RETURN keyword occurence, whichever comes first.
  758.  
  759.       procedure Resync_Cunit;
  760.       --  Synchronize to next token which could be the start of a compilation
  761.       --  unit, or to the end of file token.
  762.  
  763.    end Sync;
  764.  
  765.    -------------------------
  766.    -- Token Scan Routines --
  767.    -------------------------
  768.  
  769.    --  Routines to check for expected tokens
  770.  
  771.    package Tchk is
  772.  
  773.       --  Procedures with names of the form T_xxx, where Tok_xxx is a token
  774.       --  name, check that the current token matches the required token, and
  775.       --  if so, scan past it. If not, an error is issued indicating that
  776.       --  the required token is not present (xxx expected). In most cases, the
  777.       --  scan pointer is not moved in the not-found case, but there are some
  778.       --  exceptions to this, see for example T_Id, where the scan pointer is
  779.       --  moved across a literal appearing where an identifier is expected.
  780.  
  781.       procedure T_Abort;
  782.       procedure T_Arrow;
  783.       procedure T_At;
  784.       procedure T_Begin;
  785.       procedure T_Body;
  786.       procedure T_Box;
  787.       procedure T_Colon;
  788.       procedure T_Colon_Equal;
  789.       procedure T_Comma;
  790.       procedure T_Dot_Dot;
  791.       procedure T_For;
  792.       procedure T_Greater_Greater;
  793.       procedure T_Identifier;
  794.       procedure T_In;
  795.       procedure T_Is;
  796.       procedure T_Left_Paren;
  797.       procedure T_Loop;
  798.       procedure T_Mod;
  799.       procedure T_New;
  800.       procedure T_Of;
  801.       procedure T_Or;
  802.       procedure T_Private;
  803.       procedure T_Range;
  804.       procedure T_Record;
  805.       procedure T_Right_Paren;
  806.       procedure T_Semicolon;
  807.       procedure T_Then;
  808.       procedure T_Type;
  809.       procedure T_Use;
  810.       procedure T_When;
  811.       procedure T_With;
  812.  
  813.       --  Procedures have names of the form TF_xxx, where Tok_xxx is a token
  814.       --  name check that the current token matches the required token, and
  815.       --  if so, scan past it. If not, an error message is issued indicating
  816.       --  that the required token is not present (xxx expected).
  817.  
  818.       --  If the missing token is at the end of the line, then control returns
  819.       --  immediately after posting the message. If there are remaining tokens
  820.       --  on the current line, a search is conducted to see if the token
  821.       --  appears later on the current line, as follows:
  822.  
  823.       --  A call to Scan_Save is issued and a forward search for the token
  824.       --  is carried out. If the token is found on the current line before a
  825.       --  semicolon, then it is scanned out and the scan continues from that
  826.       --  point. If not the scan is restored to the point where it was missing.
  827.  
  828.       procedure TF_Arrow;
  829.       procedure TF_Is;
  830.       procedure TF_Loop;
  831.       procedure TF_Return;
  832.       procedure TF_Semicolon;
  833.       procedure TF_Then;
  834.       procedure TF_Use;
  835.  
  836.    end Tchk;
  837.  
  838.    ----------------------
  839.    -- Utility Routines --
  840.    ----------------------
  841.  
  842.    package Util is
  843.  
  844.       function Bad_Spelling_Of (T : Token_Type) return Boolean;
  845.       --  This function is called in an error situation. It checks if the
  846.       --  current token is an identifier whose name is a plausible bad
  847.       --  spelling of the given keyword token, and if so, issues an error
  848.       --  message, sets Token from T, and returns True. Otherwise Token is
  849.       --  unchanged, and False is returned.
  850.  
  851.       procedure Check_95_Keyword (Token_95, Next : Token_Type);
  852.       --  This routine checks if the token after the current one matches the
  853.       --  Next argument. If so, the scan is backed up to the current token
  854.       --  and Token_Type is changed to Token_95 after issuing an appropriate
  855.       --  error message ("(Ada 83) keyword xx cannot be used"). If not,
  856.       --  the scan is backed up with Token_Type unchanged. This routine
  857.       --  is used to deal with an attempt to use a 95 keyword in Ada 83
  858.       --  mode. The caller has typically checked that the current token,
  859.       --  an identifier, matches one of the 95 keywords.
  860.  
  861.       procedure Check_Simple_Expression (E : Node_Id);
  862.       --  Given an expression E, that has just been scanned, so that Expr_Form
  863.       --  is still set, outputs an error if E is a non-simple expression. E is
  864.       --  not modified by this call.
  865.  
  866.       procedure Check_Simple_Expression_In_Ada_83 (E : Node_Id);
  867.       --  Like Check_Simple_Expression, except that the error message is only
  868.       --  given when operating in Ada 83 mode, and includes "in Ada 83".
  869.  
  870.       function Check_Subtype_Mark (Mark : Node_Id) return Node_Id;
  871.       --  Called to check that a node representing a name (or call) is
  872.       --  suitable for a subtype mark, i.e, that it is an identifier or
  873.       --  a selected component. If so, or if it is already Error, then
  874.       --  it is returned unchanged. Otherwise an error message is issued
  875.       --  and Error is returned.
  876.  
  877.       function Comma_Present return Boolean;
  878.       --  Used in comma delimited lists to determine if a comma is present, or
  879.       --  can reasonably be assumed to have been present (an error message is
  880.       --  generated in the latter case). If True is returned, the scan has been
  881.       --  positioned past the comma. If False is returned, the scan position
  882.       --  is unchanged. Note that all comma-delimited lists are terminated by
  883.       --  a right paren, so the only legitimate tokens when Comma_Present is
  884.       --  called are right paren and comma. If some other token is found, then
  885.       --  Comma_Present has the job of deciding whether it is better to pretend
  886.       --  a comma was present, post a message for a missing comma and return
  887.       --  True, or return False and let the caller diagnose the missing right
  888.       --  parenthesis.
  889.  
  890.       procedure Discard_Junk_Node (N : Node_Id);
  891.       procedure Discard_Junk_List (L : List_Id);
  892.       pragma Inline (Discard_Junk_Node);
  893.       pragma Inline (Discard_Junk_List);
  894.       --  These procedures do nothing at all, their effect is simply to discard
  895.       --  the argument. A typical use is to skip by some junk that is not
  896.       --  expected in the current context.
  897.  
  898.       procedure Ignore (T : Token_Type);
  899.       --  If current token matches T, then give an error message and skip
  900.       --  past it, otherwise the call has no effect at all.
  901.  
  902.       function Is_Reserved_Identifier return Boolean;
  903.       --  Test if current token is a reserved identifier. This test is based
  904.       --  on the token being a keyword and being spelled in typical identifier
  905.       --  style (i.e. starting with an upper case letter).
  906.  
  907.       procedure No_Constraint;
  908.       --  Called in a place where no constraint is allowed, but one might
  909.       --  appear due to a common error (e.g. after the type mark in a procedure
  910.       --  parameter. If a constraint is present, an error message is posted,
  911.       --  and the constraint is scanned and discarded.
  912.  
  913.       procedure Push_Scope_Stack;
  914.       pragma Inline (Push_Scope_Stack);
  915.       --  Push a new entry onto the scope stack. Scope.Last (the stack pointer)
  916.       --  is incremented. The caller can then fill in the new top stack entry
  917.       --  at Scope.Table (Scope.Last).
  918.  
  919.       procedure Pop_Scope_Stack;
  920.       --  Pop an entry off the top of the scope stack. Scope_Last (the scope
  921.       --  table stack pointer) is decremented by one. It is a fatal error to
  922.       --  try to pop off the dummy entry at the bottom of the stack (i.e.
  923.       --  Scope.Last must be non-zero at the time of call).
  924.  
  925.       function Separate_Present return Boolean;
  926.       --  Determines if the current token is either Tok_Separate, or an
  927.       --  identifier that is a possible misspelling of "separate" followed
  928.       --  by a semicolon. True is returned if so, otherwise False.
  929.  
  930.       function Token_Is_At_Start_Of_Line return Boolean;
  931.       pragma Inline (Token_Is_At_Start_Of_Line);
  932.       --  Determines if the current token is the first token on the line
  933.  
  934.    end Util;
  935.  
  936.    ---------------------------------------
  937.    -- Specialized Syntax Check Routines --
  938.    ---------------------------------------
  939.  
  940.    function Prag (Pragma_Node : Node_Id; Semi : Source_Ptr) return Node_Id;
  941.    --  This function is passed a tree for a pragma that has been scanned out.
  942.    --  The pragma is syntactically well formed according to the general syntax
  943.    --  for pragmas and the pragma identifier is for one of the recognized
  944.    --  pragmas. It performs specific syntactic checks for specific pragmas.
  945.    --  The result is the input node if it is OK, or Error otherwise. The
  946.    --  reason that this is separated out is to facilitate the addition
  947.    --  of implementation defined pragmas. The second parameter records the
  948.    --  location of the semicolon following the pragma (this is needed for
  949.    --  correct processing of the List and Page pragmas). The returned value
  950.    --  is a copy of Pragma_Node, or Error if an error is found.
  951.  
  952.    -------------------------
  953.    -- Subsidiary Routines --
  954.    -------------------------
  955.  
  956.    procedure Labl;
  957.    --  This procedure creates implicit label declarations for all label that
  958.    --  are declared in the current unit. Note that this could conceptually
  959.    --  be done at the point where the labels are declared, but it is tricky
  960.    --  to do it then, since the tree is not hooked up at the point where the
  961.    --  label is declared (e.g. a sequence of statements is not yet attached
  962.    --  to its containing scope at the point a label in the sequence is found)
  963.  
  964.    procedure Load;
  965.    --  This procedure loads all subsidiary units that are required by this
  966.    --  unit, including with'ed units, specs for bodies, and parents for child
  967.    --  units. It does not load bodies for inlined procedures and generics,
  968.    --  since we don't know till semantic analysis is complete what is needed.
  969.  
  970.    -----------
  971.    -- Stubs --
  972.    -----------
  973.  
  974.    --  The package bodies can see all routines defined in all other subpackages
  975.  
  976.    use Ch2;
  977.    use Ch3;
  978.    use Ch4;
  979.    use Ch5;
  980.    use Ch6;
  981.    use Ch7;
  982.    use Ch8;
  983.    use Ch9;
  984.    use Ch10;
  985.    use Ch11;
  986.    use Ch12;
  987.    use Ch13;
  988.  
  989.    use Endh;
  990.    use Tchk;
  991.    use Sync;
  992.    use Util;
  993.  
  994.    package body Ch2 is separate;
  995.    package body Ch3 is separate;
  996.    package body Ch4 is separate;
  997.    package body Ch5 is separate;
  998.    package body Ch6 is separate;
  999.    package body Ch7 is separate;
  1000.    package body Ch8 is separate;
  1001.    package body Ch9 is separate;
  1002.    package body Ch10 is separate;
  1003.    package body Ch11 is separate;
  1004.    package body Ch12 is separate;
  1005.    package body Ch13 is separate;
  1006.  
  1007.    package body Endh is separate;
  1008.    package body Tchk is separate;
  1009.    package body Sync is separate;
  1010.    package body Util is separate;
  1011.  
  1012.    function Prag (Pragma_Node : Node_Id; Semi : Source_Ptr) return Node_Id
  1013.      is separate;
  1014.  
  1015.    procedure Labl is separate;
  1016.    procedure Load is separate;
  1017.  
  1018.    ---------
  1019.    -- Par --
  1020.    ---------
  1021.  
  1022. --  This function is the parse routine called at the outer level. It parses
  1023. --  the current compilation unit and adds implicit label declarations.
  1024.  
  1025. begin
  1026.    --  Special processing for language defined units
  1027.  
  1028.    if Fname.Is_Language_Defined_Unit (File_Name (Current_Source_File)) then
  1029.    --  ??? the Fname. prefix here is because of some visibility bug!
  1030.  
  1031.       --  Always force Ada_95 mode for predefined units
  1032.  
  1033.       Ada_83 := False;
  1034.       Ada_95 := True;
  1035.  
  1036.       --  If this is the main unit, disallow compilation unless the -gnatg
  1037.       --  (GNAT mode) switch is set (from a user point of view, the rule is
  1038.       --  that language defined units cannot be recompiled).
  1039.  
  1040.       if Current_Source_Unit = Main_Unit
  1041.         and then not GNAT_Mode
  1042.         and then Operating_Mode = Generate_Code
  1043.       then
  1044.          Error_Msg_SC ("language defined units may not be recompiled");
  1045.       end if;
  1046.  
  1047.    --  If not predefined unit, set Ada_83 mode from switches
  1048.  
  1049.    else
  1050.       Ada_83 := Ada_83_Switch;
  1051.       Ada_95 := not Ada_83;
  1052.    end if;
  1053.  
  1054.    --  Set features collection from switches (for main unit only)
  1055.  
  1056.    Features_On := Xref_Flag_9 and (Current_Source_Unit = Main_Unit);
  1057.  
  1058.    --  Initialize scope table and other parser control variables
  1059.  
  1060.    Compiler_State := Parsing;
  1061.    Scope.Init;
  1062.    Scope.Increment_Last;
  1063.    Scope.Table (0).Etyp := E_Dummy;
  1064.    SIS_Entry_Active := False;
  1065.    Last_Resync_Point := No_Location;
  1066.  
  1067.    --  Parse compilation unit
  1068.  
  1069.    Label_List := New_Elmt_List;
  1070.    Unit_Node := P_Compilation_Unit;
  1071.  
  1072.    --  An internal error check, the scope stack should now be empty
  1073.  
  1074.    pragma Assert (Scope.Last = 0);
  1075.  
  1076.    --  Remaining steps are to create implicit label declarations and to
  1077.    --  load required subsidiary sources. These steps are required only
  1078.    --  if we are doing semantic checking.
  1079.  
  1080.    if Operating_Mode /= Check_Syntax or else Debug_Flag_F then
  1081.       Par.Labl;
  1082.       Par.Load;
  1083.    end if;
  1084.  
  1085.    --  Restore settings of switches saved on entry
  1086.  
  1087.    Ada_83 := Save_Ada_83_Mode;
  1088.    Ada_95 := not Ada_83;
  1089.    Features_On := Save_Features_On;
  1090.    Set_Comes_From_Source_Default (False);
  1091.  
  1092. end Par;
  1093.