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-ch12.adb < prev    next >
Text File  |  1996-09-28  |  29KB  |  896 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                             P A R . C H 1 2                              --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.36 $                             --
  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. separate (Par)
  26. package body Ch12 is
  27.  
  28.    --  Local functions, used only in this chapter
  29.  
  30.    function P_Formal_Derived_Type_Definition           return Node_Id;
  31.    function P_Formal_Discrete_Type_Definition          return Node_Id;
  32.    function P_Formal_Fixed_Point_Definition            return Node_Id;
  33.    function P_Formal_Floating_Point_Definition         return Node_Id;
  34.    function P_Formal_Function_Declaration              return Node_Id;
  35.    function P_Formal_Modular_Type_Definition           return Node_Id;
  36.    function P_Formal_Package_Declaration               return Node_Id;
  37.    function P_Formal_Private_Type_Definition           return Node_Id;
  38.    function P_Formal_Procedure_Declaration             return Node_Id;
  39.    function P_Formal_Signed_Integer_Type_Definition    return Node_Id;
  40.    function P_Formal_Type_Declaration                  return Node_Id;
  41.    function P_Formal_Type_Definition                   return Node_Id;
  42.    function P_Generic_Association                      return Node_Id;
  43.  
  44.    procedure P_Formal_Object_Declarations (Decls : List_Id);
  45.    --  Scans one or more formal object declarations and appends them to
  46.    --  Decls. Scans more than one declaration only in the case where the
  47.    --  source has a declaration with multiple defining identifiers.
  48.  
  49.    --------------------------------
  50.    -- 12.1  Generic (also 8.5.5) --
  51.    --------------------------------
  52.  
  53.    --  This routine parses either one of the forms of a generic declaration
  54.    --  or a generic renaming declaration.
  55.  
  56.    --  GENERIC_DECLARATION ::=
  57.    --    GENERIC_SUBPROGRAM_DECLARATION | GENERIC_PACKAGE_DECLARATION
  58.  
  59.    --  GENERIC_SUBPROGRAM_DECLARATION ::=
  60.    --    GENERIC_FORMAL_PART SUBPROGRAM_SPECIFICATION;
  61.  
  62.    --  GENERIC_PACKAGE_DECLARATION ::=
  63.    --    GENERIC_FORMAL_PART PACKAGE_SPECIFICATION;
  64.  
  65.    --  GENERIC_FORMAL_PART ::=
  66.    --    generic {GENERIC_FORMAL_PARAMETER_DECLARATION | USE_CLAUSE}
  67.  
  68.    --  GENERIC_RENAMING_DECLARATION ::=
  69.    --    generic package DEFINING_PROGRAM_UNIT_NAME
  70.    --      renames generic_package_NAME
  71.    --  | generic procedure DEFINING_PROGRAM_UNIT_NAME
  72.    --      renames generic_procedure_NAME
  73.    --  | generic function DEFINING_PROGRAM_UNIT_NAME
  74.    --      renames generic_function_NAME
  75.  
  76.    --  GENERIC_FORMAL_PARAMETER_DECLARATION ::=
  77.    --    FORMAL_OBJECT_DECLARATION
  78.    --  | FORMAL_TYPE_DECLARATION
  79.    --  | FORMAL_SUBPROGRAM_DECLARATION
  80.    --  | FORMAL_PACKAGE_DECLARATION
  81.  
  82.    --  The caller has checked that the initial token is GENERIC
  83.  
  84.    --  Error recovery: can raise Error_Resync
  85.  
  86.    function P_Generic return Node_Id is
  87.       Gen_Sloc   : constant Source_Ptr := Token_Ptr;
  88.       Gen_Decl   : Node_Id;
  89.       Decl_Node  : Node_Id;
  90.       Decls      : List_Id;
  91.       Def_Unit   : Node_Id;
  92.       Ren_Token  : Token_Type;
  93.       Scan_State : Saved_Scan_State;
  94.  
  95.    begin
  96.       Scan; -- past GENERIC
  97.       Save_Scan_State (Scan_State); -- at token past GENERIC
  98.  
  99.       --  Check for generic renaming declaration case
  100.  
  101.       if Token = Tok_Package
  102.         or else Token = Tok_Function
  103.         or else Token = Tok_Procedure
  104.       then
  105.          Ren_Token := Token;
  106.          Scan; -- scan past PACKAGE, FUNCTION or PROCEDURE
  107.  
  108.          if Token = Tok_Identifier then
  109.             Def_Unit := P_Defining_Program_Unit_Name;
  110.  
  111.             if Token = Tok_Renames then
  112.                if Ren_Token = Tok_Package then
  113.                   Decl_Node := New_Node
  114.                     (N_Generic_Package_Renaming_Declaration, Gen_Sloc);
  115.                elsif Ren_Token = Tok_Procedure then
  116.                   Decl_Node := New_Node
  117.                     (N_Generic_Procedure_Renaming_Declaration, Gen_Sloc);
  118.                else -- Ren_Token = Tok_Function then
  119.                   Decl_Node := New_Node
  120.                     (N_Generic_Function_Renaming_Declaration, Gen_Sloc);
  121.                end if;
  122.  
  123.                Scan; -- past RENAMES
  124.                Set_Defining_Unit_Name (Decl_Node, Def_Unit);
  125.                Set_Name (Decl_Node, P_Name);
  126.                TF_Semicolon;
  127.                return Decl_Node;
  128.             end if;
  129.          end if;
  130.       end if;
  131.  
  132.       --  Fall through if this is *not* a generic renaming declaration
  133.  
  134.       Restore_Scan_State (Scan_State);
  135.       Decls := New_List;
  136.  
  137.       --  Loop through generic parameter declarations and use clauses
  138.  
  139.       Decl_Loop : loop
  140.  
  141.          if Token = Tok_Use then
  142.             Append (P_Use_Clause, Decls);
  143.          else
  144.  
  145.             --  Parse a generic parameter declaration
  146.  
  147.             if Token = Tok_Identifier then
  148.                P_Formal_Object_Declarations (Decls);
  149.  
  150.             elsif Token = Tok_Type then
  151.                Append (P_Formal_Type_Declaration, Decls);
  152.  
  153.             elsif Token = Tok_With then
  154.                Scan; -- past WITH
  155.  
  156.                if Token = Tok_Package then
  157.                   Append (P_Formal_Package_Declaration, Decls);
  158.  
  159.                elsif Token = Tok_Procedure then
  160.                   Append (P_Formal_Procedure_Declaration, Decls);
  161.  
  162.                elsif Token = Tok_Function then
  163.                   Append (P_Formal_Function_Declaration, Decls);
  164.  
  165.                else
  166.                   Error_Msg_BC
  167.                     ("FUNCTION, PROCEDURE or PACKAGE expected here");
  168.                   Resync_Past_Semicolon;
  169.                end if;
  170.  
  171.             elsif Token = Tok_Subtype then
  172.                Error_Msg_SC ("subtype declaration not allowed " &
  173.                                 "as generic parameter declaration!");
  174.                Resync_Past_Semicolon;
  175.  
  176.             else
  177.                exit Decl_Loop;
  178.             end if;
  179.          end if;
  180.  
  181.       end loop Decl_Loop;
  182.  
  183.       --  Generic formal part is scanned, scan out subprogram or package spec
  184.  
  185.       if Token = Tok_Package then
  186.          Gen_Decl := New_Node (N_Generic_Package_Declaration, Gen_Sloc);
  187.          Set_Specification (Gen_Decl, P_Package (Pf_Spcn));
  188.       else
  189.          Gen_Decl := New_Node (N_Generic_Subprogram_Declaration, Gen_Sloc);
  190.          Set_Specification (Gen_Decl, P_Subprogram_Specification);
  191.          TF_Semicolon;
  192.       end if;
  193.  
  194.       Set_Generic_Formal_Declarations (Gen_Decl, Decls);
  195.       return Gen_Decl;
  196.    end P_Generic;
  197.  
  198.    -------------------------------
  199.    -- 12.1  Generic Declaration --
  200.    -------------------------------
  201.  
  202.    --  Parsed by P_Generic (12.1)
  203.  
  204.    ------------------------------------------
  205.    -- 12.1  Generic Subprogram Declaration --
  206.    ------------------------------------------
  207.  
  208.    --  Parsed by P_Generic (12.1)
  209.  
  210.    ---------------------------------------
  211.    -- 12.1  Generic Package Declaration --
  212.    ---------------------------------------
  213.  
  214.    --  Parsed by P_Generic (12.1)
  215.  
  216.    -------------------------------
  217.    -- 12.1  Generic Formal Part --
  218.    -------------------------------
  219.  
  220.    --  Parsed by P_Generic (12.1)
  221.  
  222.    -------------------------------------------------
  223.    -- 12.1   Generic Formal Parameter Declaration --
  224.    -------------------------------------------------
  225.  
  226.    --  Parsed by P_Generic (12.1)
  227.  
  228.    ---------------------------------
  229.    -- 12.3  Generic Instantiation --
  230.    ---------------------------------
  231.  
  232.    --  Generic package instantiation parsed by P_Package (7.1)
  233.    --  Generic procedure instantiation parsed by P_Subprogram (6.1)
  234.    --  Generic function instantiation parsed by P_Subprogram (6.1)
  235.  
  236.    -------------------------------
  237.    -- 12.3  Generic Actual Part --
  238.    -------------------------------
  239.  
  240.    --  GENERIC_ACTUAL_PART ::=
  241.    --    (GENERIC_ASSOCIATION {, GENERIC_ASSOCIATION})
  242.  
  243.    --  Returns a list of generic associations, or Empty if none are present
  244.  
  245.    --  Error recovery: cannot raise Error_Resync
  246.  
  247.    function P_Generic_Actual_Part_Opt return List_Id is
  248.       Association_List : List_Id;
  249.  
  250.    begin
  251.       --  Figure out if a generic actual part operation is present. Clearly
  252.       --  there is no generic actual part if the current token is semicolon
  253.  
  254.       if Token = Tok_Semicolon then
  255.          return No_List;
  256.  
  257.       --  If we don't have a left paren, then we have an error, and the job
  258.       --  is to figure out whether a left paren or semicolon was intended.
  259.       --  We assume a missing left paren (and hence a generic actual part
  260.       --  present) if the current token is not on a new line, or if it is
  261.       --  indented from the subprogram token. Otherwise assume missing
  262.       --  semicolon (which will be diagnosed by caller) and no generic part
  263.  
  264.       elsif Token /= Tok_Left_Paren
  265.         and then Token_Is_At_Start_Of_Line
  266.         and then Start_Column <= Scope.Table (Scope.Last).Ecol
  267.       then
  268.          return No_List;
  269.  
  270.       --  Otherwise we have a generic actual part (either a left paren is
  271.       --  present, or we have decided that there must be a missing left paren)
  272.  
  273.       else
  274.          Association_List := New_List;
  275.          T_Left_Paren;
  276.  
  277.          loop
  278.             Append (P_Generic_Association, Association_List);
  279.             exit when not Comma_Present;
  280.          end loop;
  281.  
  282.          T_Right_Paren;
  283.          return Association_List;
  284.       end if;
  285.  
  286.    end P_Generic_Actual_Part_Opt;
  287.  
  288.    -------------------------------
  289.    -- 12.3  Generic Association --
  290.    -------------------------------
  291.  
  292.    --  GENERIC_ASSOCIATION ::=
  293.    --    [generic_formal_parameter_SELECTOR_NAME =>]
  294.    --      EXPLICIT_GENERIC_ACTUAL_PARAMETER
  295.  
  296.    --  EXPLICIT_GENERIC_ACTUAL_PARAMETER ::=
  297.    --    EXPRESSION      | variable_NAME   | subprogram_NAME
  298.    --  | entry_NAME      | SUBTYPE_MARK    | package_instance_NAME
  299.  
  300.    --  Error recovery: cannot raise Error_Resync
  301.  
  302.    function P_Generic_Association return Node_Id is
  303.       Scan_State         : Saved_Scan_State;
  304.       Param_Name_Node    : Node_Id;
  305.       Generic_Assoc_Node : Node_Id;
  306.  
  307.    begin
  308.       Generic_Assoc_Node := New_Node (N_Generic_Association, Token_Ptr);
  309.  
  310.       if Token in Token_Class_Desig then
  311.          Param_Name_Node := Token_Node;
  312.          Save_Scan_State (Scan_State); -- at designator
  313.          Scan; -- past simple name or operator symbol
  314.  
  315.          if Token = Tok_Arrow then
  316.             Scan; -- past arrow
  317.             Set_Selector_Name (Generic_Assoc_Node, Param_Name_Node);
  318.          else
  319.             Restore_Scan_State (Scan_State); -- to designator
  320.          end if;
  321.       end if;
  322.  
  323.       Set_Explicit_Generic_Actual_Parameter (Generic_Assoc_Node, P_Expression);
  324.       return Generic_Assoc_Node;
  325.    end P_Generic_Association;
  326.  
  327.    ---------------------------------------------
  328.    -- 12.3  Explicit Generic Actual Parameter --
  329.    ---------------------------------------------
  330.  
  331.    --  Parsed by P_Generic_Association (12.3)
  332.  
  333.    --------------------------------------
  334.    -- 12.4  Formal Object Declarations --
  335.    --------------------------------------
  336.  
  337.    --  FORMAL_OBJECT_DECLARATION ::=
  338.    --    DEFINING_IDENTIFIER_LIST :
  339.    --      MODE SUBTYPE_MARK [:= DEFAULT_EXPRESSION];
  340.  
  341.    --  The caller has checked that the initial token is an identifier
  342.  
  343.    --  Error recovery: cannot raise Error_Resync
  344.  
  345.    procedure P_Formal_Object_Declarations (Decls : List_Id) is
  346.       Decl_Node  : Node_Id;
  347.       Scan_State : Saved_Scan_State;
  348.       Num_Idents : Nat;
  349.       Ident      : Nat;
  350.  
  351.       Idents : array (Int range 1 .. 4096) of Entity_Id;
  352.       --  This array holds the list of defining identifiers. The upper bound
  353.       --  of 4096 is intended to be essentially infinite, and we do not even
  354.       --  bother to check for it being exceeded.
  355.  
  356.    begin
  357.       Idents (1) := P_Defining_Identifier;
  358.       Num_Idents := 1;
  359.  
  360.       while Comma_Present loop
  361.          Num_Idents := Num_Idents + 1;
  362.          Idents (Num_Idents) := P_Defining_Identifier;
  363.       end loop;
  364.  
  365.       T_Colon;
  366.  
  367.       --  If there are multiple identifiers, we repeatedly scan the
  368.       --  type and initialization expression information by resetting
  369.       --  the scan pointer (so that we get completely separate trees
  370.       --  for each occurrence).
  371.  
  372.       if Num_Idents > 1 then
  373.          Save_Scan_State (Scan_State);
  374.       end if;
  375.  
  376.       --  Loop through defining identifiers in list
  377.  
  378.       Ident := 1;
  379.       Ident_Loop : loop
  380.          Decl_Node := New_Node (N_Formal_Object_Declaration, Token_Ptr);
  381.          Set_Defining_Identifier (Decl_Node, Idents (Ident));
  382.          P_Mode (Decl_Node);
  383.          Set_Subtype_Mark (Decl_Node, P_Subtype_Mark_Resync);
  384.          No_Constraint;
  385.          Set_Expression (Decl_Node, Init_Expr_Opt);
  386.  
  387.          if Ident > 1 then
  388.             Set_Prev_Ids (Decl_Node, True);
  389.          end if;
  390.  
  391.          if Ident < Num_Idents then
  392.             Set_More_Ids (Decl_Node, True);
  393.          end if;
  394.  
  395.          Append (Decl_Node, Decls);
  396.  
  397.          exit Ident_Loop when Ident = Num_Idents;
  398.          Ident := Ident + 1;
  399.          Restore_Scan_State (Scan_State);
  400.       end loop Ident_Loop;
  401.  
  402.       TF_Semicolon;
  403.    end P_Formal_Object_Declarations;
  404.  
  405.    -----------------------------------
  406.    -- 12.5  Formal Type Declaration --
  407.    -----------------------------------
  408.  
  409.    --  FORMAL_TYPE_DECLARATION ::=
  410.    --    type DEFINING_IDENTIFIER [DISCRIMINANT_PART]
  411.    --      is FORMAL_TYPE_DEFINITION;
  412.  
  413.    --  The caller has checked that the initial token is TYPE
  414.  
  415.    --  Error recovery: cannot raise Error_Resync
  416.  
  417.    function P_Formal_Type_Declaration return Node_Id is
  418.       Decl_Node  : Node_Id;
  419.       Discr_Part : Node_Id;
  420.  
  421.    begin
  422.       Decl_Node := New_Node (N_Formal_Type_Declaration, Token_Ptr);
  423.       Scan; -- past TYPE
  424.       Set_Defining_Identifier (Decl_Node, P_Defining_Identifier);
  425.  
  426.       if P_Unknown_Discriminant_Part_Opt then
  427.          Set_Unknown_Discriminants_Present (Decl_Node, True);
  428.       else
  429.          Set_Discriminant_Specifications
  430.            (Decl_Node, P_Known_Discriminant_Part_Opt);
  431.       end if;
  432.  
  433.       T_Is;
  434.  
  435.       Set_Formal_Type_Definition (Decl_Node, P_Formal_Type_Definition);
  436.       TF_Semicolon;
  437.       return Decl_Node;
  438.    end P_Formal_Type_Declaration;
  439.  
  440.    ----------------------------------
  441.    -- 12.5  Formal Type Definition --
  442.    ----------------------------------
  443.  
  444.    --  FORMAL_TYPE_DEFINITION ::=
  445.    --    FORMAL_PRIVATE_TYPE_DEFINITION
  446.    --  | FORMAL_DERIVED_TYPE_DEFINITION
  447.    --  | FORMAL_DISCRETE_TYPE_DEFINITION
  448.    --  | FORMAL_SIGNED_INTEGER_TYPE_DEFINITION
  449.    --  | FORMAL_MODULAR_TYPE_DEFINITION
  450.    --  | FORMAL_FLOATING_POINT_DEFINITION
  451.    --  | FORMAL_ORDINARY_FIXED_POINT_DEFINITION
  452.    --  | FORMAL_DECIMAL_FIXED_POINT_DEFINITION
  453.    --  | FORMAL_ARRAY_TYPE_DEFINITION
  454.    --  | FORMAL_ACCESS_TYPE_DEFINITION
  455.  
  456.    --  FORMAL_ARRAY_TYPE_DEFINITION ::= ARRAY_TYPE_DEFINITION
  457.  
  458.    --  FORMAL_ACCESS_TYPE_DEFINITION ::= ACCESS_TYPE_DEFINITION
  459.  
  460.    function P_Formal_Type_Definition return Node_Id is
  461.       Scan_State : Saved_Scan_State;
  462.  
  463.    begin
  464.       if Token_Name = Name_Abstract then
  465.          Check_95_Keyword (Tok_Abstract, Tok_Tagged);
  466.       end if;
  467.  
  468.       if Token_Name = Name_Tagged then
  469.          Check_95_Keyword (Tok_Tagged, Tok_Private);
  470.          Check_95_Keyword (Tok_Tagged, Tok_Limited);
  471.       end if;
  472.  
  473.       case Token is
  474.  
  475.          --  Mostly we can tell what we have from the initial token. The one
  476.          --  exception is ABSTRACT, where we have to scan ahead to see if we
  477.          --  have a formal derived type or a formal private type definition.
  478.  
  479.          when Tok_Abstract =>
  480.             Note_Feature (Abstract_Types, Token_Ptr);
  481.             Save_Scan_State (Scan_State);
  482.             Scan; -- past ABSTRACT
  483.  
  484.             if Token = Tok_New then
  485.                Restore_Scan_State (Scan_State); -- to ABSTRACT
  486.                return P_Formal_Derived_Type_Definition;
  487.  
  488.             else
  489.                Restore_Scan_State (Scan_State); -- to ABSTRACT
  490.                return P_Formal_Private_Type_Definition;
  491.             end if;
  492.  
  493.          when Tok_Private | Tok_Limited | Tok_Tagged =>
  494.             return P_Formal_Private_Type_Definition;
  495.  
  496.          when Tok_New =>
  497.             return P_Formal_Derived_Type_Definition;
  498.  
  499.          when Tok_Left_Paren =>
  500.             return P_Formal_Discrete_Type_Definition;
  501.  
  502.          when Tok_Range =>
  503.             return P_Formal_Signed_Integer_Type_Definition;
  504.  
  505.          when Tok_Mod =>
  506.             return P_Formal_Modular_Type_Definition;
  507.  
  508.          when Tok_Digits =>
  509.             return P_Formal_Floating_Point_Definition;
  510.  
  511.          when Tok_Delta =>
  512.             return P_Formal_Fixed_Point_Definition;
  513.  
  514.          when Tok_Array =>
  515.             return P_Array_Type_Definition;
  516.  
  517.          when Tok_Access =>
  518.             return P_Access_Type_Definition;
  519.  
  520.          when Tok_Record =>
  521.             Error_Msg_SC ("record not allowed in generic type definition!");
  522.             Discard_Junk_Node (P_Record_Definition);
  523.             return Error;
  524.  
  525.          when others =>
  526.             Error_Msg_BC ("expecting generic type definition here");
  527.             Resync_Past_Semicolon;
  528.             return Error;
  529.  
  530.       end case;
  531.    end P_Formal_Type_Definition;
  532.  
  533.    --------------------------------------------
  534.    -- 12.5.1  Formal Private Type Definition --
  535.    --------------------------------------------
  536.  
  537.    --  FORMAL_PRIVATE_TYPE_DEFINITION ::=
  538.    --    [[abstract] tagged] [limited] private
  539.  
  540.    --  The caller has checked the initial token is PRIVATE, ABSTRACT,
  541.    --   TAGGED or LIMITED
  542.  
  543.    --  Error recovery: cannot raise Error_Resync
  544.  
  545.    function P_Formal_Private_Type_Definition return Node_Id is
  546.       Def_Node : Node_Id;
  547.  
  548.    begin
  549.       Def_Node := New_Node (N_Formal_Private_Type_Definition, Token_Ptr);
  550.  
  551.       if Token = Tok_Abstract then
  552.          Note_Feature (Generic_Formal_Private_Types, Token_Ptr);
  553.          Scan; -- past ABSTRACT
  554.  
  555.          if Token_Name = Name_Tagged then
  556.             Check_95_Keyword (Tok_Tagged, Tok_Private);
  557.             Check_95_Keyword (Tok_Tagged, Tok_Limited);
  558.          end if;
  559.  
  560.          if Token /= Tok_Tagged then
  561.             Error_Msg_SP ("ABSTRACT must be followed by TAGGED");
  562.          else
  563.             Set_Abstract_Present (Def_Node, True);
  564.          end if;
  565.       end if;
  566.  
  567.       if Token = Tok_Tagged then
  568.          Note_Feature (Generic_Formal_Private_Types, Token_Ptr);
  569.          Note_Feature (Tagged_Types, Token_Ptr);
  570.          Set_Tagged_Present (Def_Node, True);
  571.          Scan; -- past TAGGED
  572.       end if;
  573.  
  574.       if Token = Tok_Limited then
  575.          Set_Limited_Present (Def_Node, True);
  576.          Scan; -- past LIMITED
  577.       end if;
  578.  
  579.       Set_Sloc (Def_Node, Token_Ptr);
  580.       T_Private;
  581.       return Def_Node;
  582.    end P_Formal_Private_Type_Definition;
  583.  
  584.    --------------------------------------------
  585.    -- 12.5.1  Formal Derived Type Definition --
  586.    --------------------------------------------
  587.  
  588.    --  FORMAL_DERIVED_TYPE_DEFINITION ::=
  589.    --    [abstract] new SUBTYPE_MARK [with private]
  590.  
  591.    --  The caller has checked the initial token(s) is/are NEW or ASTRACT NEW
  592.  
  593.    --  Error recovery: cannot raise Error_Resync
  594.  
  595.    function P_Formal_Derived_Type_Definition return Node_Id is
  596.       Def_Node : Node_Id;
  597.  
  598.    begin
  599.       Def_Node := New_Node (N_Formal_Derived_Type_Definition, Token_Ptr);
  600.  
  601.       if Token = Tok_Abstract then
  602.          Set_Abstract_Present (Def_Node);
  603.          Scan; -- past ABSTRACT
  604.       end if;
  605.  
  606.       Scan; -- past NEW;
  607.       Set_Subtype_Mark (Def_Node, P_Subtype_Mark);
  608.       No_Constraint;
  609.  
  610.       if Token = Tok_With then
  611.          Scan; -- past WITH
  612.          Set_Private_Present (Def_Node, True);
  613.          T_Private;
  614.       end if;
  615.  
  616.       return Def_Node;
  617.    end P_Formal_Derived_Type_Definition;
  618.  
  619.    ---------------------------------------------
  620.    -- 12.5.2  Formal Discrete Type Definition --
  621.    ---------------------------------------------
  622.  
  623.    --  FORMAL_DISCRETE_TYPE_DEFINITION ::= (<>)
  624.  
  625.    --  The caller has checked the initial token is left paren
  626.  
  627.    --  Error recovery: cannot raise Error_Resync
  628.  
  629.    function P_Formal_Discrete_Type_Definition return Node_Id is
  630.       Def_Node : Node_Id;
  631.  
  632.    begin
  633.       Def_Node := New_Node (N_Formal_Discrete_Type_Definition, Token_Ptr);
  634.       Note_Feature (Generic_Contract_Rules, Token_Ptr);
  635.       Scan; -- past left paren
  636.       T_Box;
  637.       T_Right_Paren;
  638.       return Def_Node;
  639.    end P_Formal_Discrete_Type_Definition;
  640.  
  641.    ---------------------------------------------------
  642.    -- 12.5.2  Formal Signed Integer Type Definition --
  643.    ---------------------------------------------------
  644.  
  645.    --  FORMAL_SIGNED_INTEGER_TYPE_DEFINITION ::= range <>
  646.  
  647.    --  The caller has checked the initial token is RANGE
  648.  
  649.    --  Error recovery: cannot raise Error_Resync
  650.  
  651.    function P_Formal_Signed_Integer_Type_Definition return Node_Id is
  652.       Def_Node : Node_Id;
  653.  
  654.    begin
  655.       Def_Node :=
  656.         New_Node (N_Formal_Signed_Integer_Type_Definition, Token_Ptr);
  657.       Scan; -- past RANGE
  658.       T_Box;
  659.       return Def_Node;
  660.    end P_Formal_Signed_Integer_Type_Definition;
  661.  
  662.    --------------------------------------------
  663.    -- 12.5.2  Formal Modular Type Definition --
  664.    --------------------------------------------
  665.  
  666.    --  FORMAL_MODULAR_TYPE_DEFINITION ::= mod <>
  667.  
  668.    --  The caller has checked the initial token is MOD
  669.  
  670.    --  Error recovery: cannot raise Error_Resync
  671.  
  672.    function P_Formal_Modular_Type_Definition return Node_Id is
  673.       Def_Node : Node_Id;
  674.  
  675.    begin
  676.       Def_Node :=
  677.         New_Node (N_Formal_Modular_Type_Definition, Token_Ptr);
  678.       Scan; -- past MOD
  679.       T_Box;
  680.       return Def_Node;
  681.    end P_Formal_Modular_Type_Definition;
  682.  
  683.    ----------------------------------------------
  684.    -- 12.5.2  Formal Floating Point Definition --
  685.    ----------------------------------------------
  686.  
  687.    --  FORMAL_FLOATING_POINT_DEFINITION ::= digits <>
  688.  
  689.    --  The caller has checked the initial token is DIGITS
  690.  
  691.    --  Error recovery: cannot raise Error_Resync
  692.  
  693.    function P_Formal_Floating_Point_Definition return Node_Id is
  694.       Def_Node : Node_Id;
  695.  
  696.    begin
  697.       Def_Node :=
  698.         New_Node (N_Formal_Floating_Point_Definition, Token_Ptr);
  699.       Scan; -- past DIGITS
  700.       T_Box;
  701.       return Def_Node;
  702.    end P_Formal_Floating_Point_Definition;
  703.  
  704.    -------------------------------------------
  705.    -- 12.5.2  Formal Fixed Point Definition --
  706.    -------------------------------------------
  707.  
  708.    --  This routine parses either a formal ordinary fixed point definition
  709.    --  or a formal decimal fixed point definition:
  710.  
  711.    --  FORMAL_ORDINARY_FIXED_POINT_DEFINITION ::= delta <>
  712.  
  713.    --  FORMAL_DECIMAL_FIXED_POINT_DEFINITION ::= delta <> digits <>
  714.  
  715.    --  The caller has checked the initial token is DELTA
  716.  
  717.    --  Error recovery: cannot raise Error_Resync
  718.  
  719.    function P_Formal_Fixed_Point_Definition return Node_Id is
  720.       Def_Node   : Node_Id;
  721.       Delta_Sloc : Source_Ptr;
  722.  
  723.    begin
  724.       Delta_Sloc := Token_Ptr;
  725.       Scan; -- past DELTA
  726.       T_Box;
  727.  
  728.       if Token = Tok_Digits then
  729.          Def_Node :=
  730.            New_Node (N_Formal_Decimal_Fixed_Point_Definition, Delta_Sloc);
  731.          Scan; -- past DIGITS
  732.          T_Box;
  733.       else
  734.          Def_Node :=
  735.            New_Node (N_Formal_Ordinary_Fixed_Point_Definition, Delta_Sloc);
  736.       end if;
  737.  
  738.       return Def_Node;
  739.    end P_Formal_Fixed_Point_Definition;
  740.  
  741.    ----------------------------------------------------
  742.    -- 12.5.2  Formal Ordinary Fixed Point Definition --
  743.    ----------------------------------------------------
  744.  
  745.    --  Parsed by P_Formal_Fixed_Point_Definition (12.5.2)
  746.  
  747.    ---------------------------------------------------
  748.    -- 12.5.2  Formal Decimal Fixed Point Definition --
  749.    ---------------------------------------------------
  750.  
  751.    --  Parsed by P_Formal_Fixed_Point_Definition (12.5.2)
  752.  
  753.    ------------------------------------------
  754.    -- 12.5.3  Formal Array Type Definition --
  755.    ------------------------------------------
  756.  
  757.    --  Parsed by P_Formal_Type_Definition (12.5)
  758.  
  759.    -------------------------------------------
  760.    -- 12.5.4  Formal Access Type Definition --
  761.    -------------------------------------------
  762.  
  763.    --  Parsed by P_Formal_Type_Definition (12.5)
  764.  
  765.    -----------------------------------------
  766.    -- 12.6  Formal Subprogram Declaration --
  767.    -----------------------------------------
  768.  
  769.    --  FORMAL_SUBPROGRAM_DECLARATION ::=
  770.    --    with SUBPROGRAM_SPECIFICATION [is SUBPROGRAM_DEFAULT];
  771.  
  772.    --  SUBPROGRAM_DEFAULT ::= DEFAULT_NAME | <>
  773.  
  774.    --  DEFAULT_NAME ::= NAME
  775.  
  776.    --  The caller has checked that the initial tokens are WITH FUNCTION or
  777.    --  WITH PROCEDURE, and the initial WITH has been scanned out.
  778.  
  779.    --  Note: we separate this into two procedures because the name is allowed
  780.    --  to be an operator symbol for a function, but not for a procedure.
  781.  
  782.    --  Error recovery: cannot raise Error_Resync
  783.  
  784.    function P_Formal_Function_Declaration return Node_Id is
  785.       Def_Node : Node_Id;
  786.  
  787.    begin
  788.       Def_Node := New_Node (N_Formal_Subprogram_Declaration, Prev_Token_Ptr);
  789.       Set_Specification (Def_Node, P_Subprogram_Specification);
  790.  
  791.       if Token = Tok_Is then
  792.          Scan; -- past IS
  793.  
  794.          if Token = Tok_Box then
  795.             Set_Box_Present (Def_Node, True);
  796.             Scan; -- past <>
  797.  
  798.          else
  799.             Set_Default_Name (Def_Node, P_Name);
  800.          end if;
  801.       end if;
  802.  
  803.       T_Semicolon;
  804.       return Def_Node;
  805.    end P_Formal_Function_Declaration;
  806.  
  807.    function P_Formal_Procedure_Declaration return Node_Id is
  808.       Def_Node : Node_Id;
  809.  
  810.    begin
  811.       Def_Node := New_Node (N_Formal_Subprogram_Declaration, Prev_Token_Ptr);
  812.       Set_Specification (Def_Node, P_Subprogram_Specification);
  813.  
  814.       if Token = Tok_Is then
  815.          Scan; -- past IS
  816.  
  817.          if Token = Tok_Box then
  818.             Set_Box_Present (Def_Node, True);
  819.             Scan; -- past <>
  820.  
  821.          else
  822.             Set_Default_Name (Def_Node, P_Qualified_Simple_Name);
  823.          end if;
  824.       end if;
  825.  
  826.       T_Semicolon;
  827.       return Def_Node;
  828.    end P_Formal_Procedure_Declaration;
  829.  
  830.    ------------------------------
  831.    -- 12.6  Subprogram Default --
  832.    ------------------------------
  833.  
  834.    --  Parsed by P_Formal_Procedure_Declaration (12.6)
  835.  
  836.    ------------------------
  837.    -- 12.6  Default Name --
  838.    ------------------------
  839.  
  840.    --  Parsed by P_Formal_Procedure_Declaration (12.6)
  841.  
  842.    --------------------------------------
  843.    -- 12.7  Formal Package Declaration --
  844.    --------------------------------------
  845.  
  846.    --  FORMAL_PACKAGE_DECLARATION ::=
  847.    --    with package DEFINING_IDENTIFIER
  848.    --      is new generic_package_NAME FORMAL_PACKAGE_ACTUAL_PART;
  849.  
  850.    --  FORMAL_PACKAGE_ACTUAL_PART ::=
  851.    --    (<>) | [GENERIC_ACTUAL_PART]
  852.  
  853.    --  The caller has checked that the initial tokens are WITH PACKAGE,
  854.    --  and the initial WITH has been scanned out (so Token = Tok_Package).
  855.  
  856.    --  Error recovery: cannot raise Error_Resync
  857.  
  858.    function P_Formal_Package_Declaration return Node_Id is
  859.       Def_Node : Node_Id;
  860.       Scan_State : Saved_Scan_State;
  861.  
  862.    begin
  863.       Scan; -- past PACKAGE
  864.       Def_Node := New_Node (N_Formal_Package_Declaration, Prev_Token_Ptr);
  865.       Set_Defining_Identifier (Def_Node, P_Defining_Identifier);
  866.       T_Is;
  867.       T_New;
  868.       Set_Name (Def_Node, P_Qualified_Simple_Name);
  869.  
  870.       if Token = Tok_Left_Paren then
  871.          Save_Scan_State (Scan_State); -- at the left paren
  872.          Scan; -- past the left paren
  873.  
  874.          if Token = Tok_Box then
  875.             Set_Box_Present (Def_Node, True);
  876.             Scan; -- past box
  877.             T_Right_Paren;
  878.  
  879.          else
  880.             Restore_Scan_State (Scan_State); -- to the left paren
  881.             Set_Generic_Associations (Def_Node, P_Generic_Actual_Part_Opt);
  882.          end if;
  883.       end if;
  884.  
  885.       T_Semicolon;
  886.       return Def_Node;
  887.    end P_Formal_Package_Declaration;
  888.  
  889.    --------------------------------------
  890.    -- 12.7  Formal Package Actual Part --
  891.    --------------------------------------
  892.  
  893.    --  Parsed by P_Formal_Package_Declaration (12.7)
  894.  
  895. end Ch12;
  896.