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-ch3.adb < prev    next >
Text File  |  1996-09-28  |  113KB  |  3,411 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                              P A R . C H 3                               --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.101 $                            --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 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 Sinfo.CN; use Sinfo.CN;
  26.  
  27. separate (Par)
  28.  
  29. package body Ch3 is
  30.  
  31.    -----------------------
  32.    -- Local Subprograms --
  33.    -----------------------
  34.  
  35.    function P_Component_List                               return Node_Id;
  36.    function P_Defining_Character_Literal                   return Node_Id;
  37.    function P_Delta_Constraint                             return Node_Id;
  38.    function P_Derived_Type_Def_Or_Private_Ext_Decl         return Node_Id;
  39.    function P_Digits_Constraint                            return Node_Id;
  40.    function P_Discriminant_Association                     return Node_Id;
  41.    function P_Enumeration_Literal_Specification            return Node_Id;
  42.    function P_Enumeration_Type_Definition                  return Node_Id;
  43.    function P_Fixed_Point_Definition                       return Node_Id;
  44.    function P_Floating_Point_Definition                    return Node_Id;
  45.    function P_Index_Or_Discriminant_Constraint             return Node_Id;
  46.    function P_Real_Range_Specification_Opt                 return Node_Id;
  47.    function P_Subtype_Declaration                          return Node_Id;
  48.    function P_Type_Declaration                             return Node_Id;
  49.    function P_Modular_Type_Definition                      return Node_Id;
  50.    function P_Variant                                      return Node_Id;
  51.    function P_Variant_Part                                 return Node_Id;
  52.  
  53.    procedure P_Declarative_Items
  54.      (Decls   : List_Id;
  55.       Done    : out Boolean;
  56.       Msg_Id  : in out Error_Msg_Id;
  57.       In_Spec : Boolean);
  58.    --  Scans out a single declarative item, or, in the case of a declaration
  59.    --  with a list of identifiers, a list of declarations, one for each of
  60.    --  the identifiers in the list. The declaration or declarations scanned
  61.    --  are appended to the given list. Done indicates whether or not there
  62.    --  may be additional declarative items to scan. If Done is True, then
  63.    --  a decision has been made that there are no more items to scan. If
  64.    --  Done is False, then there may be additional declarations to scan.
  65.    --  In_Spec is true if we are scanning a package declaration, and is used
  66.    --  to generate an appropriate message if a statement is encountered in
  67.    --  such a context. Msg_Id saves the Id of the first "declaration expected"
  68.    --  message, since only one such message is generated per declarative part,
  69.    --  and also, this message is changed to "BEGIN expected" if no BEGIN is
  70.    --  subsequently encountered.
  71.  
  72.    procedure P_Identifier_Declarations
  73.      (Decls   : List_Id;
  74.       Done    : out Boolean;
  75.       Msg_Id  : in out Error_Msg_Id;
  76.       In_Spec : Boolean);
  77.    --  Scans out a set of declarations for an identifier or list of
  78.    --  identifiers, and appends them to the given list. The parameters have
  79.    --  the same significance as for P_Declarative_Items.
  80.  
  81.    procedure Statement_When_Declaration_Expected
  82.      (Decls   : List_Id;
  83.       Done    : out Boolean;
  84.       Msg_Id  : in out Error_Msg_Id;
  85.       In_Spec : Boolean);
  86.    --  Called when a statement is found at a point where a declaration was
  87.    --  expected. The parameters are as described for P_Declarative_Items.
  88.  
  89.    -------------------
  90.    -- Init_Expr_Opt --
  91.    -------------------
  92.  
  93.    function Init_Expr_Opt (P : Boolean := False) return Node_Id is
  94.    begin
  95.       if Token = Tok_Colon_Equal
  96.         or else Token = Tok_Equal
  97.         or else Token = Tok_Colon
  98.         or else Token = Tok_Is
  99.       then
  100.          T_Colon_Equal;
  101.  
  102.          if P then
  103.             return P_Expression;
  104.          else
  105.             return P_Expression_No_Right_Paren;
  106.          end if;
  107.  
  108.       else
  109.          return Empty;
  110.       end if;
  111.    end Init_Expr_Opt;
  112.  
  113.    ----------------------------
  114.    -- 3.1  Basic Declaration --
  115.    ----------------------------
  116.  
  117.    --  Parsed by P_Basic_Declarative_Items (3.9)
  118.  
  119.    ------------------------------
  120.    -- 3.1  Defining Identifier --
  121.    ------------------------------
  122.  
  123.    --  DEFINING_IDENTIFIER ::= IDENTIFIER
  124.  
  125.    --  Error recovery: can raise Error_Resync
  126.  
  127.    function P_Defining_Identifier return Node_Id is
  128.       Ident_Node : Node_Id;
  129.  
  130.    begin
  131.       --  Scan out the identifier. Note that this code is essentially identical
  132.       --  to P_Identifier, except that in the call to Scan_Reserved_Identifier
  133.       --  we set Force_Msg to True, since we want at least one message for each
  134.       --  separate declaration (but not use) of a reserved identifier.
  135.  
  136.       if Token = Tok_Identifier then
  137.          null;
  138.  
  139.       --  If we have a reserved identifier, manufacture an identifier with
  140.       --  a corresponding name after posting an appropriate error message
  141.  
  142.       elsif Is_Reserved_Identifier then
  143.          Scan_Reserved_Identifier (Force_Msg => True);
  144.  
  145.       --  Otherwise we have junk that cannot be interpreted as an identifier
  146.  
  147.       else
  148.          T_Identifier; -- to give message
  149.          raise Error_Resync;
  150.       end if;
  151.  
  152.       Ident_Node := Token_Node;
  153.       Scan; -- past the reserved identifier
  154.  
  155.       if Ident_Node /= Error then
  156.          Change_Identifier_To_Defining_Identifier (Ident_Node);
  157.       end if;
  158.  
  159.       return Ident_Node;
  160.    end P_Defining_Identifier;
  161.  
  162.    -----------------------------
  163.    -- 3.2.1  Type Declaration --
  164.    -----------------------------
  165.  
  166.    --  TYPE_DECLARATION ::=
  167.    --    FULL_TYPE_DECLARATION
  168.    --  | INCOMPLETE_TYPE_DECLARATION
  169.    --  | PRIVATE_TYPE_DECLARATION
  170.    --  | PRIVATE_EXTENSION_DECLARATION
  171.  
  172.    --  FULL_TYPE_DECLARATION ::=
  173.    --    type DEFINING_IDENTIFIER [KNOWN_DISCRIMINANT_PART] is TYPE_DEFINITION;
  174.    --  | CONCURRENT_TYPE_DECLARATION
  175.  
  176.    --  INCOMPLETE_TYPE_DECLARATION ::=
  177.    --    type DEFINING_IDENTIFIER [DISCRIMINANT_PART];
  178.  
  179.    --  PRIVATE_TYPE_DECLARATION ::=
  180.    --    type DEFINING_IDENTIFIER [DISCRIMINANT_PART]
  181.    --      is [abstract] [tagged] [limited] private;
  182.  
  183.    --  PRIVATE_EXTENSION_DECLARATION ::=
  184.    --    type DEFINING_IDENTIFIER [DISCRIMINANT_PART] is
  185.    --      [abstract] new ancestor_SUBTYPE_INDICATION with private;
  186.  
  187.    --  TYPE_DEFINITION ::=
  188.    --    ENUMERATION_TYPE_DEFINITION  | INTEGER_TYPE_DEFINITION
  189.    --  | REAL_TYPE_DEFINITION         | ARRAY_TYPE_DEFINITION
  190.    --  | RECORD_TYPE_DEFINITION       | ACCESS_TYPE_DEFINITION
  191.    --  | DERIVED_TYPE_DEFINITION
  192.  
  193.    --  INTEGER_TYPE_DEFINITION ::=
  194.    --    SIGNED_INTEGER_TYPE_DEFINITION
  195.    --    MODULAR_TYPE_DEFINITION
  196.  
  197.    --  Error recovery: can raise Error_Resync
  198.  
  199.    --  Note: The processing for full type declaration, incomplete type
  200.    --  declaration, private type declaration and type definition is
  201.    --  included in this function. The processing for concurrent type
  202.    --  declarations is NOT here, but rather in chapter 9 (i.e. this
  203.    --  function handles only declarations starting with TYPE).
  204.  
  205.    function P_Type_Declaration return Node_Id is
  206.       Type_Loc         : Source_Ptr;
  207.       Type_Start_Col   : Column_Number;
  208.       Ident_Node       : Node_Id;
  209.       Decl_Node        : Node_Id;
  210.       Discr_List       : List_Id;
  211.       Unknown_Dis      : Boolean;
  212.       Discr_Sloc       : Source_Ptr;
  213.       Abstract_Present : Boolean := False;
  214.       Abstract_Loc     : Source_Ptr;
  215.  
  216.       Typedef_Node : Node_Id;
  217.       --  Normally holds type definition, except in the case of a private
  218.       --  extension declaration, in which case it holds the declaration itself
  219.  
  220.    begin
  221.       Type_Loc := Token_Ptr;
  222.       Type_Start_Col := Start_Column;
  223.       T_Type;
  224.       Ident_Node := P_Defining_Identifier;
  225.       Discr_Sloc := Token_Ptr;
  226.  
  227.       if P_Unknown_Discriminant_Part_Opt then
  228.          Unknown_Dis := True;
  229.          Discr_List := No_List;
  230.       else
  231.          Unknown_Dis := False;
  232.          Discr_List := P_Known_Discriminant_Part_Opt;
  233.       end if;
  234.  
  235.       --  Incomplete type declaration. We complete the processing for this
  236.       --  case here and return the resulting incomplete type declaration node
  237.  
  238.       if Token = Tok_Semicolon then
  239.          Scan; -- past ;
  240.          Decl_Node := New_Node (N_Incomplete_Type_Declaration, Type_Loc);
  241.          Set_Defining_Identifier (Decl_Node, Ident_Node);
  242.          Set_Unknown_Discriminants_Present (Decl_Node, Unknown_Dis);
  243.          Set_Discriminant_Specifications (Decl_Node, Discr_List);
  244.          return Decl_Node;
  245.       end if;
  246.  
  247.       --  Full type declaration or private type declaration, must have IS
  248.  
  249.       if Token = Tok_Equal then
  250.          TF_Is;
  251.          Scan; -- past = used in place of IS
  252.       else
  253.          TF_Is;
  254.       end if;
  255.  
  256.       if Token_Name = Name_Abstract then
  257.          Check_95_Keyword (Tok_Abstract, Tok_Tagged);
  258.          Check_95_Keyword (Tok_Abstract, Tok_New);
  259.       end if;
  260.  
  261.       if Token = Tok_Abstract then
  262.          Note_Feature (Abstract_Types, Token_Ptr);
  263.          Abstract_Present := True;
  264.          Abstract_Loc := Token_Ptr;
  265.          Scan; -- past ABSTRACT
  266.  
  267.          if Token = Tok_Limited
  268.            or else Token = Tok_Private
  269.            or else Token = Tok_Record
  270.          then
  271.             Error_Msg_AP ("TAGGED expected");
  272.          end if;
  273.       end if;
  274.  
  275.       if Token_Name = Name_Tagged then
  276.          Check_95_Keyword (Tok_Tagged, Tok_Private);
  277.          Check_95_Keyword (Tok_Tagged, Tok_Limited);
  278.          Check_95_Keyword (Tok_Tagged, Tok_Record);
  279.       end if;
  280.  
  281.       if Token = Tok_Aliased or else Token_Name = Name_Aliased then
  282.          Error_Msg_SC ("ALIASED not allowed in type definition");
  283.          Scan; -- past ALIASED
  284.       end if;
  285.  
  286.       --  The following procesing deals with either a private type declaration
  287.       --  or a full type declaration. In the private type case, we build the
  288.       --  N_Private_Type_Declaration node, setting its Tagged_Present and
  289.       --  Limited_Present flags, on encountering the Private keyword, and
  290.       --  leave Typedef_Node set to Empty. For the full type declaration
  291.       --  case, Typedef_Node gets set to the type definition.
  292.  
  293.       Typedef_Node := Empty;
  294.  
  295.       --  Switch on token following the IS
  296.  
  297.       case Token is
  298.  
  299.          when Tok_Range =>
  300.             Typedef_Node := P_Signed_Integer_Type_Definition;
  301.             TF_Semicolon;
  302.  
  303.          when Tok_Mod =>
  304.             Typedef_Node := P_Modular_Type_Definition;
  305.             TF_Semicolon;
  306.  
  307.          when Tok_New =>
  308.             Typedef_Node := P_Derived_Type_Def_Or_Private_Ext_Decl;
  309.             TF_Semicolon;
  310.  
  311.          when Tok_Array =>
  312.             Typedef_Node := P_Array_Type_Definition;
  313.             TF_Semicolon;
  314.  
  315.          when Tok_Access =>
  316.             Typedef_Node := P_Access_Type_Definition;
  317.             TF_Semicolon;
  318.  
  319.          when Tok_Left_Paren =>
  320.             Typedef_Node := P_Enumeration_Type_Definition;
  321.             TF_Semicolon;
  322.  
  323.          when Tok_Digits =>
  324.             Typedef_Node := P_Floating_Point_Definition;
  325.             TF_Semicolon;
  326.  
  327.          when Tok_Delta =>
  328.             Typedef_Node := P_Fixed_Point_Definition;
  329.             TF_Semicolon;
  330.  
  331.          when Tok_Record =>
  332.             Typedef_Node := P_Record_Definition;
  333.             TF_Semicolon;
  334.  
  335.          when Tok_Null =>
  336.             Typedef_Node := P_Record_Definition;
  337.             TF_Semicolon;
  338.  
  339.          when Tok_Tagged =>
  340.             Note_Feature (Tagged_Types, Token_Ptr);
  341.             Scan; -- past TAGGED
  342.  
  343.             if Token = Tok_Abstract then
  344.                Error_Msg_SC ("ABSTRACT must come before TAGGED");
  345.                Note_Feature (Abstract_Types, Token_Ptr);
  346.                Abstract_Present := True;
  347.                Abstract_Loc := Token_Ptr;
  348.                Scan; -- past ABSTRACT
  349.             end if;
  350.  
  351.             if Token = Tok_Limited then
  352.                Scan; -- past LIMITED
  353.  
  354.                --  TAGGED LIMITED PRIVATE case
  355.  
  356.                if Token = Tok_Private then
  357.                   Decl_Node := New_Node (N_Private_Type_Declaration, Type_Loc);
  358.                   Set_Tagged_Present (Decl_Node, True);
  359.                   Set_Limited_Present (Decl_Node, True);
  360.                   Scan; -- past PRIVATE
  361.  
  362.                --  TAGGED LIMITED RECORD
  363.  
  364.                else
  365.                   Typedef_Node := P_Record_Definition;
  366.                   Set_Tagged_Present (Typedef_Node, True);
  367.                   Set_Limited_Present (Typedef_Node, True);
  368.                end if;
  369.  
  370.             else
  371.                --  TAGGED PRIVATE
  372.  
  373.                if Token = Tok_Private then
  374.                   Decl_Node := New_Node (N_Private_Type_Declaration, Type_Loc);
  375.                   Set_Tagged_Present (Decl_Node, True);
  376.                   Scan; -- past PRIVATE
  377.  
  378.                --  TAGGED RECORD
  379.  
  380.                else
  381.                   Typedef_Node := P_Record_Definition;
  382.                   Set_Tagged_Present (Typedef_Node, True);
  383.                end if;
  384.             end if;
  385.  
  386.             TF_Semicolon;
  387.  
  388.          --  PRIVATE
  389.  
  390.          when Tok_Private =>
  391.             Decl_Node := New_Node (N_Private_Type_Declaration, Type_Loc);
  392.             Scan; -- past PRIVATE
  393.             TF_Semicolon;
  394.  
  395.          when Tok_Limited =>
  396.             Scan; -- past LIMITED
  397.  
  398.             loop
  399.                if Token = Tok_Tagged then
  400.                   Error_Msg_SC ("TAGGED must comes before LIMITED");
  401.                   Scan; -- past TAGGED
  402.  
  403.                elsif Token = Tok_Abstract then
  404.                   Error_Msg_SC ("ABSTRACT must comes before LIMITED");
  405.                   Scan; -- past ABSTRACT
  406.  
  407.                else
  408.                   exit;
  409.                end if;
  410.             end loop;
  411.  
  412.             --  LIMITED RECORD or LIMITED NULL RECORD
  413.  
  414.             if Token = Tok_Record or else Token = Tok_Null then
  415.                Note_Feature (Limited_Record_Types, Prev_Token_Ptr);
  416.  
  417.                if Ada_83 then
  418.                   Error_Msg_SP
  419.                     ("(Ada 83) limited record declaration not allowed!");
  420.                end if;
  421.  
  422.                Typedef_Node := P_Record_Definition;
  423.                Set_Limited_Present (Typedef_Node, True);
  424.  
  425.             --  LIMITED PRIVATE is the only remaining possibility here
  426.  
  427.             else
  428.                Decl_Node := New_Node (N_Private_Type_Declaration, Type_Loc);
  429.                Set_Limited_Present (Decl_Node, True);
  430.                T_Private; -- past PRIVATE (or complain if not there!)
  431.             end if;
  432.  
  433.             TF_Semicolon;
  434.  
  435.          --  Here we have an identifier after the IS, which is certainly wrong
  436.          --  and which might be one of several different mistakes.
  437.  
  438.          when Tok_Identifier =>
  439.  
  440.             --  First case, if identifier is on same line, then probably we
  441.             --  have something like "type X is Integer .." and the best
  442.             --  diagnosis is a missing NEW. Note that the missing new message
  443.             --  will be posted by P_Derived_Type_Def_Or_Private_Ext_Decl.
  444.  
  445.             if not Token_Is_At_Start_Of_Line then
  446.                Typedef_Node := P_Derived_Type_Def_Or_Private_Ext_Decl;
  447.                TF_Semicolon;
  448.  
  449.             --  If the identifier is at the start of the line, and is in the
  450.             --  same column as the type declaration itself then we consider
  451.             --  that we had a missing type definition on the previous line
  452.  
  453.             elsif Start_Column <= Type_Start_Col then
  454.                Error_Msg_AP ("type definition expected");
  455.                Typedef_Node := Error;
  456.  
  457.             --  If the identifier is at the start of the line, and is in
  458.             --  a column to the right of the type declaration line, then we
  459.             --  may have something like:
  460.  
  461.             --    type x is
  462.             --       r : integer
  463.  
  464.             --  and the best diagnosis is a missing record keyword
  465.  
  466.             else
  467.                Typedef_Node := P_Record_Definition;
  468.                TF_Semicolon;
  469.             end if;
  470.  
  471.          --  Anything else is an error
  472.  
  473.          when others =>
  474.             Error_Msg_AP ("type definition expected");
  475.             raise Error_Resync;
  476.       end case;
  477.  
  478.       --  For the private type declaration case, the private type declaration
  479.       --  node has been built, with the Tagged_Present and Limited_Present
  480.       --  flags set as needed, and Typedef_Node is left set to Empty.
  481.  
  482.       if No (Typedef_Node) then
  483.          Set_Unknown_Discriminants_Present (Decl_Node, Unknown_Dis);
  484.          Set_Abstract_Present (Decl_Node, Abstract_Present);
  485.  
  486.       --  For a private extension declaration, Typedef_Node contains the
  487.       --  N_Private_Extension_Declaration node, which we now complete. Note
  488.       --  that the private extension declaration, unlike a full type
  489.       --  declaration, does permit unknown discriminants.
  490.  
  491.       elsif Nkind (Typedef_Node) = N_Private_Extension_Declaration then
  492.          Decl_Node := Typedef_Node;
  493.          Set_Sloc (Decl_Node, Type_Loc);
  494.          Set_Unknown_Discriminants_Present (Decl_Node, Unknown_Dis);
  495.          Set_Abstract_Present (Typedef_Node, Abstract_Present);
  496.  
  497.       --  In the full type declaration case, Typedef_Node has the type
  498.       --  definition and here is where we build the full type declaration
  499.       --  node. This is also where we check for improper use of an unknown
  500.       --  discriminant part (not allowed for full type declaration).
  501.  
  502.       else
  503.          if Nkind (Typedef_Node) = N_Record_Definition
  504.            or else (Nkind (Typedef_Node) = N_Derived_Type_Definition
  505.                       and then Present (Record_Extension_Part (Typedef_Node)))
  506.          then
  507.             Set_Abstract_Present (Typedef_Node, Abstract_Present);
  508.  
  509.          elsif Abstract_Present then
  510.             Error_Msg ("ABSTRACT not allowed here, ignored", Abstract_Loc);
  511.          end if;
  512.  
  513.          Decl_Node := New_Node (N_Full_Type_Declaration, Type_Loc);
  514.          Set_Type_Definition (Decl_Node, Typedef_Node);
  515.  
  516.          if Unknown_Dis then
  517.             Error_Msg
  518.               ("Full type declaration cannot have unknown discriminants",
  519.                 Discr_Sloc);
  520.          end if;
  521.       end if;
  522.  
  523.       --  Remaining processing is common for all three cases
  524.  
  525.       Set_Defining_Identifier (Decl_Node, Ident_Node);
  526.       Set_Discriminant_Specifications (Decl_Node, Discr_List);
  527.       return Decl_Node;
  528.  
  529.    end P_Type_Declaration;
  530.  
  531.    ----------------------------------
  532.    -- 3.2.1  Full Type Declaration --
  533.    ----------------------------------
  534.  
  535.    --  Parsed by P_Type_Declaration (3.2.1)
  536.  
  537.    ----------------------------
  538.    -- 3.2.1  Type Definition --
  539.    ----------------------------
  540.  
  541.    --  Parsed by P_Type_Declaration (3.2.1)
  542.  
  543.    --------------------------------
  544.    -- 3.2.2  Subtype Declaration --
  545.    --------------------------------
  546.  
  547.    --  SUBTYPE_DECLARATION ::=
  548.    --    subtype DEFINING_IDENTIFIER is SUBTYPE_INDICATION;
  549.  
  550.    --  The caller has checked that the initial token is SUBTYPE
  551.  
  552.    --  Error recovery: can raise Error_Resync
  553.  
  554.    function P_Subtype_Declaration return Node_Id is
  555.       Decl_Node : Node_Id;
  556.  
  557.    begin
  558.       Decl_Node := New_Node (N_Subtype_Declaration, Token_Ptr);
  559.       Scan; -- past SUBTYPE
  560.       Set_Defining_Identifier (Decl_Node, P_Defining_Identifier);
  561.       TF_Is;
  562.  
  563.       if Token = Tok_New then
  564.          Error_Msg_SC ("NEW ignored (only allowed in type declaration)");
  565.          Scan; -- past NEW
  566.       end if;
  567.  
  568.       Set_Subtype_Indication (Decl_Node, P_Subtype_Indication);
  569.       TF_Semicolon;
  570.       return Decl_Node;
  571.    end P_Subtype_Declaration;
  572.  
  573.    -------------------------------
  574.    -- 3.2.2  Subtype Indication --
  575.    -------------------------------
  576.  
  577.    --  SUBTYPE_INDICATION ::= SUBTYPE_MARK [CONSTRAINT]
  578.  
  579.    --  Error recovery: can raise Error_Resync
  580.  
  581.    function P_Subtype_Indication return Node_Id is
  582.       Type_Node : Node_Id;
  583.  
  584.    begin
  585.       if Token = Tok_Identifier or else Token = Tok_Operator_Symbol then
  586.          Type_Node := P_Subtype_Mark;
  587.  
  588.       else
  589.          --  Check for error of using record definition and treat it nicely,
  590.          --  otherwise things are really messed up, so resynchronize.
  591.  
  592.          if Token = Tok_Record then
  593.             Error_Msg_SC ("anonymous record definitions are not permitted");
  594.             Discard_Junk_Node (P_Record_Definition);
  595.             return Error;
  596.  
  597.          else
  598.             Error_Msg_AP ("subtype indication expected");
  599.             raise Error_Resync;
  600.          end if;
  601.  
  602.       end if;
  603.  
  604.       return P_Subtype_Indication (Type_Node);
  605.  
  606.    end P_Subtype_Indication;
  607.  
  608.    --  The following function is identical except that it is called with
  609.    --  the subtype mark already scanned out, and it scans out the constraint
  610.  
  611.    --  Error recovery: can raise Error_Resync
  612.  
  613.    function P_Subtype_Indication (Subtype_Mark : Node_Id) return Node_Id is
  614.       Indic_Node  : Node_Id;
  615.       Constr_Node : Node_Id;
  616.  
  617.    begin
  618.       Constr_Node := P_Constraint_Opt;
  619.  
  620.       if No (Constr_Node) then
  621.          return Subtype_Mark;
  622.       else
  623.          Indic_Node := New_Node (N_Subtype_Indication, Token_Ptr);
  624.          Set_Subtype_Mark (Indic_Node, Check_Subtype_Mark (Subtype_Mark));
  625.          Set_Constraint (Indic_Node, Constr_Node);
  626.          return Indic_Node;
  627.       end if;
  628.  
  629.    end P_Subtype_Indication;
  630.  
  631.    -------------------------
  632.    -- 3.2.2  Subtype Mark --
  633.    -------------------------
  634.  
  635.    --  SUBTYPE_MARK ::= subtype_NAME;
  636.  
  637.    --  Note: The subtype mark which appears after an IN or NOT IN
  638.    --  operator is parsed by P_Range_Or_Subtype_Mark (3.5)
  639.  
  640.    --  Error recovery: cannot raise Error_Resync
  641.  
  642.    function P_Subtype_Mark return Node_Id is
  643.    begin
  644.       return P_Subtype_Mark_Resync;
  645.  
  646.    exception
  647.       when Error_Resync =>
  648.          return Error;
  649.    end P_Subtype_Mark;
  650.  
  651.    --  This routine differs from P_Subtype_Mark in that it insists that an
  652.    --  identifier be present, and if it is not, it raises Error_Resync.
  653.  
  654.    --  Error recovery: can raise Error_Resync
  655.  
  656.    function P_Subtype_Mark_Resync return Node_Id is
  657.       Type_Node : Node_Id;
  658.       Attr_Node : Node_Id;
  659.  
  660.    begin
  661.       if Token = Tok_Array then
  662.          Error_Msg_SC ("anonymous array definition not allowed here");
  663.          Discard_Junk_Node (P_Array_Type_Definition);
  664.          return Empty;
  665.  
  666.       else
  667.          Type_Node := P_Qualified_Simple_Name_Resync;
  668.  
  669.          --  Check for a subtype mark attribute. The only valid possibilities
  670.          --  are 'CLASS and 'BASE. Anything else is a definite error. We may
  671.          --  as well catch it here.
  672.  
  673.          if Token = Tok_Apostrophe then
  674.             return P_Subtype_Mark_Attribute (Type_Node);
  675.          else
  676.             return Type_Node;
  677.          end if;
  678.       end if;
  679.    end P_Subtype_Mark_Resync;
  680.  
  681.    --  The following function is called to scan out a subtype mark attribute.
  682.    --  The caller has already scanned out the subtype mark, which is passed in
  683.    --  as the argument, and has checked that the current token is apostrophe.
  684.  
  685.    --  Only a special subclass of attributes, called type attributes
  686.    --  (see Snames package) are allowed in this syntactic position.
  687.  
  688.    --  Note: if the apostrophe is followed by other than an identifier, then
  689.    --  the input expression is returned unchanged, and the scan pointer is
  690.    --  left pointing to the apostrophe.
  691.  
  692.    --  Error recovery: can raise Error_Resync
  693.  
  694.    function P_Subtype_Mark_Attribute (Type_Node : Node_Id) return Node_Id is
  695.       Attr_Node   : Node_Id;
  696.       Scan_State  : Saved_Scan_State;
  697.       Prefix      : Node_Id;
  698.  
  699.    begin
  700.       Prefix := Check_Subtype_Mark (Type_Node);
  701.  
  702.       if Prefix = Error then
  703.          raise Error_Resync;
  704.       end if;
  705.  
  706.       --  Loop through attributes appearing (more than one can appear as for
  707.       --  for example in X'Base'Class). We are at an apostrophe on entry to
  708.       --  this loop, and it runs once for each attribute parsed, with
  709.       --  Prefix being the current possible prefix if it is an attribute.
  710.  
  711.       loop
  712.          Save_Scan_State (Scan_State); -- at Apostrophe
  713.          Scan; -- past apostrophe
  714.  
  715.          if Token /= Tok_Identifier then
  716.             Restore_Scan_State (Scan_State); -- to apostrophe
  717.             return Prefix; -- no attribute after all
  718.  
  719.          elsif not Is_Type_Attribute_Name (Token_Name) then
  720.             Error_Msg_N
  721.               ("attribute & may not be used in a subtype mark", Token_Node);
  722.             raise Error_Resync;
  723.  
  724.          else
  725.             Attr_Node :=
  726.               Make_Attribute_Reference (Prev_Token_Ptr,
  727.                 Prefix => Prefix,
  728.                 Attribute_Name => Token_Name);
  729.             Delete_Node (Token_Node);
  730.             Scan; -- past type attribute identifier
  731.          end if;
  732.  
  733.          exit when Token /= Tok_Apostrophe;
  734.          Prefix := Attr_Node;
  735.       end loop;
  736.  
  737.       --  Fall through here after scanning type attribute
  738.  
  739.       return Attr_Node;
  740.    end P_Subtype_Mark_Attribute;
  741.  
  742.    -----------------------
  743.    -- 3.2.2  Constraint --
  744.    -----------------------
  745.  
  746.    --  CONSTRAINT ::= SCALAR_CONSTRAINT | COMPOSITE_CONSTRAINT
  747.  
  748.    --  SCALAR_CONSTRAINT ::=
  749.    --    RANGE_CONSTRAINT | DIGITS_CONSTRAINT | DELTA_CONSTRAINT
  750.  
  751.    --  COMPOSITE_CONSTRAINT ::=
  752.    --    INDEX_CONSTRAINT | DISCRIMINANT_CONSTRAINT
  753.  
  754.    --  If no constraint is present, this function returns Empty
  755.  
  756.    --  Error recovery: can raise Error_Resync
  757.  
  758.    function P_Constraint_Opt return Node_Id is
  759.    begin
  760.       if Token = Tok_Range then
  761.          return P_Range_Constraint;
  762.  
  763.       elsif Token = Tok_Digits then
  764.          return P_Digits_Constraint;
  765.  
  766.       elsif Token = Tok_Delta then
  767.          return P_Delta_Constraint;
  768.  
  769.       elsif Token = Tok_Left_Paren then
  770.          return P_Index_Or_Discriminant_Constraint;
  771.  
  772.       else
  773.          return Empty;
  774.       end if;
  775.  
  776.    end P_Constraint_Opt;
  777.  
  778.    ------------------------------
  779.    -- 3.2.2  Scalar Constraint --
  780.    ------------------------------
  781.  
  782.    --  Parsed by P_Constraint_Opt (3.2.2)
  783.  
  784.    ---------------------------------
  785.    -- 3.2.2  Composite Constraint --
  786.    ---------------------------------
  787.  
  788.    --  Parsed by P_Constraint_Opt (3.2.2)
  789.  
  790.    --------------------------------------------------------
  791.    -- 3.3  Identifier Declarations (Also 7.4, 8.5, 11.1) --
  792.    --------------------------------------------------------
  793.  
  794.    --  This routine scans out a declaration starting with an identifier:
  795.  
  796.    --  OBJECT_DECLARATION ::=
  797.    --    DEFINING_IDENTIFIER_LIST : [constant] [aliased]
  798.    --      SUBTYPE_INDICATION [:= EXPRESSION];
  799.    --  | DEFINING_IDENTIFIER_LIST : [constant] [aliased]
  800.    --      ARRAY_TYPE_DEFINITION [:= EXPRESSION];
  801.  
  802.    --  NUMBER_DECLARATION ::=
  803.    --    DEFINING_IDENTIFIER_LIST : constant ::= static_EXPRESSION;
  804.  
  805.    --  OBJECT_RENAMING_DECLARATION ::=
  806.    --    DEFINING_IDENTIFIER : SUBTYPE_MARK renames object_NAME;
  807.  
  808.    --  EXCEPTION_RENAMING_DECLARATION ::=
  809.    --    DEFINING_IDENTIFIER : exception renames exception_NAME;
  810.  
  811.    --  EXCEPTION_DECLARATION ::=
  812.    --    DEFINING_IDENTIFIER_LIST : exception;
  813.  
  814.    --  Note that the ALIASED indication in an object declaration is
  815.    --  marked by a flag in the parent node.
  816.  
  817.    --  The caller has checked that the initial token is an identifier
  818.  
  819.    --  The value returned is a list of declarations, one for each identifier
  820.    --  in the list (as described in Sinfo, we always split up multiple
  821.    --  declarations into the equivalent sequence of single declarations
  822.    --  using the More_Ids and Prev_Ids flags to preserve the source).
  823.  
  824.    --  If the identifier turns out to be a probable statement rather than
  825.    --  an identifier, then the scan is left pointing to the identifier and
  826.    --  No_List is returned.
  827.  
  828.    --  Error recovery: can raise Error_Resync
  829.  
  830.    procedure P_Identifier_Declarations
  831.      (Decls   : List_Id;
  832.       Done    : out Boolean;
  833.       Msg_Id  : in out Error_Msg_Id;
  834.       In_Spec : Boolean)
  835.    is
  836.       Decl_Node    : Node_Id;
  837.       Type_Node    : Node_Id;
  838.       Ident_Sloc   : Source_Ptr;
  839.       Scan_State   : Saved_Scan_State;
  840.       List_OK      : Boolean := True;
  841.       Ident        : Nat;
  842.       Init_Expr    : Node_Id;
  843.       Init_Loc     : Source_Ptr;
  844.  
  845.       Idents : array (Int range 1 .. 4096) of Entity_Id;
  846.       --  Used to save identifiers in the identifier list. The upper bound
  847.       --  of 4096 is expected to be infinite in practice, and we do not even
  848.       --  bother to check if this upper bound is exceeded.
  849.  
  850.       Num_Idents : Nat := 1;
  851.       --  Number of identifiers stored in Idents
  852.  
  853.       procedure No_List;
  854.       --  This procedure is called in renames cases to make sure that we do
  855.       --  not have more than one identifier. If we do have more than one
  856.       --  then an error message is issued (and the declaration is split into
  857.       --  multiple declarations)
  858.  
  859.       procedure No_List is
  860.       begin
  861.          if Num_Idents > 1 then
  862.             Error_Msg ("identifier list not allowed for RENAMES",
  863.                        Sloc (Idents (2)));
  864.          end if;
  865.  
  866.          List_OK := False;
  867.       end No_List;
  868.  
  869.    --  Start of processing for P_Identifier_Declarations
  870.  
  871.    begin
  872.       Ident_Sloc := Token_Ptr;
  873.       Save_Scan_State (Scan_State); -- at first identifier
  874.       Idents (1) := P_Defining_Identifier;
  875.  
  876.       --  If we have a colon after the identifier, then we can assume that
  877.       --  this is in fact a valid identifier declaration and can steam ahead.
  878.  
  879.       if Token = Tok_Colon then
  880.          Scan; -- past colon
  881.  
  882.       --  If we have a comma, then scan out the list of identifiers
  883.  
  884.       elsif Token = Tok_Comma then
  885.  
  886.          while Comma_Present loop
  887.             Num_Idents := Num_Idents + 1;
  888.             Idents (Num_Idents) := P_Defining_Identifier;
  889.          end loop;
  890.  
  891.          Save_Scan_State (Scan_State); -- at colon
  892.          T_Colon;
  893.  
  894.       --  If we have identifier followed by := then we assume that what is
  895.       --  really meant is an assignment statement. The assignment statement
  896.       --  is scanned out and added to the list of declarations. An exception
  897.       --  occurs if the := is followed by the keyword constant, in which case
  898.       --  we assume it was meant to be a colon.
  899.  
  900.       elsif Token = Tok_Colon_Equal then
  901.          Scan; -- past :=
  902.  
  903.          if Token = Tok_Constant then
  904.             Error_Msg_SP ("colon expected");
  905.  
  906.          else
  907.             Restore_Scan_State (Scan_State);
  908.             Statement_When_Declaration_Expected (Decls, Done, Msg_Id, In_Spec);
  909.             return;
  910.          end if;
  911.  
  912.       --  If we have an IS keyword, then assume the TYPE keyword was missing
  913.  
  914.       elsif Token = Tok_Is then
  915.          Restore_Scan_State (Scan_State);
  916.          Append_To (Decls, P_Type_Declaration);
  917.          return;
  918.  
  919.       --  Otherwise we have an error situation
  920.  
  921.       else
  922.          Restore_Scan_State (Scan_State);
  923.  
  924.          --  First case is possible misuse of PROTECTED in Ada 83 mode. If
  925.          --  so, fix the keyword and return to scan the protected declaration.
  926.  
  927.          if Token_Name = Name_Protected then
  928.             Check_95_Keyword (Tok_Protected, Tok_Identifier);
  929.             Check_95_Keyword (Tok_Protected, Tok_Type);
  930.             Check_95_Keyword (Tok_Protected, Tok_Body);
  931.  
  932.             if Token = Tok_Protected then
  933.                Done := False;
  934.                return;
  935.             end if;
  936.  
  937.          --  Check misspelling possibilities. If so, correct the misspelling
  938.          --  and return to scan out the resulting declaration.
  939.  
  940.          elsif Bad_Spelling_Of (Tok_Function)
  941.            or else Bad_Spelling_Of (Tok_Procedure)
  942.            or else Bad_Spelling_Of (Tok_Package)
  943.            or else Bad_Spelling_Of (Tok_Pragma)
  944.            or else Bad_Spelling_Of (Tok_Protected)
  945.            or else Bad_Spelling_Of (Tok_Generic)
  946.            or else Bad_Spelling_Of (Tok_Subtype)
  947.            or else Bad_Spelling_Of (Tok_Type)
  948.            or else Bad_Spelling_Of (Tok_Task)
  949.            or else Bad_Spelling_Of (Tok_Use)
  950.            or else Bad_Spelling_Of (Tok_For)
  951.          then
  952.             Done := False;
  953.             return;
  954.  
  955.          --  Otherwise we definitely have an ordinary identifier with a junk
  956.          --  token after it. Just complain that we need a colon and plough on.
  957.  
  958.          else
  959.             Scan; -- past identifier
  960.             T_Colon;
  961.          end if;
  962.       end if;
  963.  
  964.       --  Come here with an identifier list and colon scanned out. We now
  965.       --  build the nodes for the declarative items. One node is built for
  966.       --  each identifier in the list, with the type information being
  967.       --  repeated by rescanning the appropriate section of source.
  968.  
  969.       --  Loop through identifiers
  970.  
  971.       Ident := 1;
  972.       Ident_Loop : loop
  973.  
  974.          if Token_Name = Name_Aliased then
  975.             Check_95_Keyword (Tok_Aliased, Tok_Array);
  976.             Check_95_Keyword (Tok_Aliased, Tok_Identifier);
  977.             Check_95_Keyword (Tok_Aliased, Tok_Constant);
  978.  
  979.          --  Check for const in place of constant
  980.  
  981.          elsif Token_Name = Name_Const then
  982.             Save_Scan_State (Scan_State);
  983.             Scan; -- past const
  984.  
  985.             if Token = Tok_Identifier or else Token = Tok_Array then
  986.                Restore_Scan_State (Scan_State);
  987.                Error_Msg_SC ("Incorrect spelling of keyword CONSTANT");
  988.                Token := Tok_Constant;
  989.             else
  990.                Restore_Scan_State (Scan_State);
  991.             end if;
  992.          end if;
  993.  
  994.          --  Constant cases
  995.  
  996.          if Token = Tok_Constant then
  997.             Scan; -- past CONSTANT
  998.  
  999.             --  Number declaration, initialization required
  1000.  
  1001.             Init_Expr := Init_Expr_Opt;
  1002.  
  1003.             if Present (Init_Expr) then
  1004.                Decl_Node := New_Node (N_Number_Declaration, Ident_Sloc);
  1005.                Set_Expression (Decl_Node, Init_Expr);
  1006.  
  1007.             --  Constant object declaration
  1008.  
  1009.             else
  1010.                Decl_Node := New_Node (N_Object_Declaration, Ident_Sloc);
  1011.                Set_Constant_Present (Decl_Node, True);
  1012.  
  1013.                if Token_Name = Name_Aliased then
  1014.                   Check_95_Keyword (Tok_Aliased, Tok_Array);
  1015.                   Check_95_Keyword (Tok_Aliased, Tok_Identifier);
  1016.                end if;
  1017.  
  1018.                if Token = Tok_Aliased then
  1019.                   Error_Msg_SC ("ALIASED should be before CONSTANT");
  1020.                   Scan; -- past ALIASED
  1021.                   Set_Aliased_Present (Decl_Node, True);
  1022.                end if;
  1023.  
  1024.                if Token = Tok_Array then
  1025.                   Set_Object_Definition
  1026.                     (Decl_Node, P_Array_Type_Definition);
  1027.                else
  1028.                   Set_Object_Definition (Decl_Node, P_Subtype_Indication);
  1029.                end if;
  1030.             end if;
  1031.  
  1032.          --  Exception cases
  1033.  
  1034.          elsif Token = Tok_Exception then
  1035.             Scan; -- past EXCEPTION
  1036.  
  1037.             if Token = Tok_Renames then
  1038.                Scan; -- past RENAMES
  1039.                No_List;
  1040.                Decl_Node :=
  1041.                  New_Node (N_Exception_Renaming_Declaration, Ident_Sloc);
  1042.                Set_Name (Decl_Node, P_Qualified_Simple_Name_Resync);
  1043.                No_Constraint;
  1044.             else
  1045.                Decl_Node := New_Node (N_Exception_Declaration, Prev_Token_Ptr);
  1046.             end if;
  1047.  
  1048.          --  Aliased case (note that an object definition is required)
  1049.  
  1050.          elsif Token = Tok_Aliased then
  1051.             Note_Feature (Aliased_Objects, Token_Ptr);
  1052.             Scan; -- past ALIASED
  1053.             Decl_Node := New_Node (N_Object_Declaration, Ident_Sloc);
  1054.             Set_Aliased_Present (Decl_Node, True);
  1055.  
  1056.             if Token = Tok_Constant then
  1057.                Scan; -- past CONSTANT
  1058.                Set_Constant_Present (Decl_Node, True);
  1059.             end if;
  1060.  
  1061.             if Token = Tok_Array then
  1062.                Set_Object_Definition
  1063.                  (Decl_Node, P_Array_Type_Definition);
  1064.             else
  1065.                Set_Object_Definition (Decl_Node, P_Subtype_Indication);
  1066.             end if;
  1067.  
  1068.          --  Array case
  1069.  
  1070.          elsif Token = Tok_Array then
  1071.             Decl_Node := New_Node (N_Object_Declaration, Ident_Sloc);
  1072.             Set_Object_Definition (Decl_Node, P_Array_Type_Definition);
  1073.  
  1074.          --  Subtype indication case
  1075.  
  1076.          else
  1077.             Type_Node := P_Subtype_Mark;
  1078.  
  1079.             --  Object renaming declaration
  1080.  
  1081.             if Token = Tok_Renames then
  1082.  
  1083.                Scan; -- past RENAMES
  1084.                No_List;
  1085.                Decl_Node :=
  1086.                  New_Node (N_Object_Renaming_Declaration, Ident_Sloc);
  1087.                Set_Subtype_Mark (Decl_Node, Type_Node);
  1088.                Set_Name (Decl_Node, P_Name);
  1089.  
  1090.             --  Object declaration
  1091.  
  1092.             else
  1093.                Decl_Node := New_Node (N_Object_Declaration, Ident_Sloc);
  1094.                Set_Object_Definition
  1095.                  (Decl_Node, P_Subtype_Indication (Type_Node));
  1096.  
  1097.                --  RENAMES at this point means that we had the combination of
  1098.                --  a constraint on the Type_Node and renames, which is illegal
  1099.  
  1100.                if Token = Tok_Renames then
  1101.                   Error_Msg_N
  1102.                     ("constraint not allowed in object renaming declaration",
  1103.                      Constraint (Object_Definition (Decl_Node)));
  1104.                   raise Error_Resync;
  1105.                end if;
  1106.             end if;
  1107.          end if;
  1108.  
  1109.          --  Scan out initialization, allowed only for object declaration
  1110.  
  1111.          Init_Loc := Token_Ptr;
  1112.          Init_Expr := Init_Expr_Opt;
  1113.  
  1114.          if Present (Init_Expr) then
  1115.             if Nkind (Decl_Node) = N_Object_Declaration then
  1116.                Set_Expression (Decl_Node, Init_Expr);
  1117.             else
  1118.                Error_Msg ("initialization not allowed here", Init_Loc);
  1119.             end if;
  1120.          end if;
  1121.  
  1122.          TF_Semicolon;
  1123.          Set_Defining_Identifier (Decl_Node, Idents (Ident));
  1124.  
  1125.          if List_OK then
  1126.             if Ident < Num_Idents then
  1127.                Set_More_Ids (Decl_Node, True);
  1128.             end if;
  1129.  
  1130.             if Ident > 1 then
  1131.                Set_Prev_Ids (Decl_Node, True);
  1132.             end if;
  1133.          end if;
  1134.  
  1135.          Append (Decl_Node, Decls);
  1136.          exit Ident_Loop when Ident = Num_Idents;
  1137.          Restore_Scan_State (Scan_State);
  1138.          T_Colon;
  1139.          Ident := Ident + 1;
  1140.       end loop Ident_Loop;
  1141.  
  1142.       Done := False;
  1143.  
  1144.    end P_Identifier_Declarations;
  1145.  
  1146.    -------------------------------
  1147.    -- 3.3.1  Object Declaration --
  1148.    -------------------------------
  1149.  
  1150.    --  OBJECT DECLARATION ::=
  1151.    --    DEFINING_IDENTIFIER_LIST : [aliased] [constant]
  1152.    --      SUBTYPE_INDICATION [:= EXPRESSION];
  1153.    --  | DEFINING_IDENTIFIER_LIST : [aliased] [constant]
  1154.    --      ARRAY_TYPE_DEFINITION [:= EXPRESSION];
  1155.    --  | SINGLE_TASK_DECLARATION
  1156.    --  | SINGLE_PROTECTED_DECLARATION
  1157.  
  1158.    --  Cases starting with TASK are parsed by P_Task (9.1)
  1159.    --  Cases starting with PROTECTED are parsed by P_Protected (9.4)
  1160.    --  All other cases are parsed by P_Identifier_Declarations (3.3)
  1161.  
  1162.    -------------------------------------
  1163.    -- 3.3.1  Defining Identifier List --
  1164.    -------------------------------------
  1165.  
  1166.    --  DEFINING_IDENTIFIER_LIST ::=
  1167.    --    DEFINING_IDENTIFIER {, DEFINING_IDENTIFIER}
  1168.  
  1169.    --  Always parsed by the construct in which it appears. See special
  1170.    --  section on "Handling of Defining Identifier Lists" in this unit.
  1171.  
  1172.    -------------------------------
  1173.    -- 3.3.2  Number Declaration --
  1174.    -------------------------------
  1175.  
  1176.    --  Parsed by P_Identifier_Declarations (3.3)
  1177.  
  1178.    -------------------------------------------------------------------------
  1179.    -- 3.4  Derived Type Definition or Private Extension Declaration (7.3) --
  1180.    -------------------------------------------------------------------------
  1181.  
  1182.    --  DERIVED_TYPE_DEFINITION ::=
  1183.    --    [abstract] new parent_SUBTYPE_INDICATION [RECORD_EXTENSION_PART]
  1184.  
  1185.    --  PRIVATE_EXTENSION_DECLARATION ::=
  1186.    --     type DEFINING_IDENTIFIER [DISCRIMINANT_PART] is
  1187.    --       [abstract] new ancestor_SUBTYPE_INDICATION with PRIVATE;
  1188.  
  1189.    --  RECORD_EXTENSION_PART ::= with RECORD_DEFINITION
  1190.  
  1191.    --  The caller has already scanned out the part up to the NEW, and Token
  1192.    --  either contains Tok_New (or ought to, if it doesn't this procedure
  1193.    --  will post an appropriate "NEW expected" message).
  1194.  
  1195.    --  Note: the caller is responsible for filling in the Sloc field of
  1196.    --  the returned node in the private extension declaration case as
  1197.    --  well as the stuff relating to the discriminant part.
  1198.  
  1199.    --  Error recovery: can raise Error_Resync;
  1200.  
  1201.    function P_Derived_Type_Def_Or_Private_Ext_Decl return Node_Id is
  1202.       Typedef_Node  : Node_Id;
  1203.       Typedecl_Node : Node_Id;
  1204.  
  1205.    begin
  1206.       Typedef_Node := New_Node (N_Derived_Type_Definition, Token_Ptr);
  1207.       T_New;
  1208.  
  1209.       if Token = Tok_Abstract then
  1210.          Error_Msg_SC ("ABSTRACT must come before NEW, not after");
  1211.          Scan;
  1212.       end if;
  1213.  
  1214.       Set_Subtype_Indication (Typedef_Node, P_Subtype_Indication);
  1215.  
  1216.       --  Deal with record extension, note that we assume that a WITH is
  1217.       --  missing in the case of "type X is new Y record ..." or in the
  1218.       --  case of "type X is new Y null record".
  1219.  
  1220.       if Token = Tok_With
  1221.         or else Token = Tok_Record
  1222.         or else Token = Tok_Null
  1223.       then
  1224.          T_With; -- past WITH or give error message
  1225.  
  1226.          if Token = Tok_Limited then
  1227.             Error_Msg_SC
  1228.               ("LIMITED keyword not allowed in private extension");
  1229.             Scan; -- ignore LIMITED
  1230.          end if;
  1231.  
  1232.          --  Private extension declaration
  1233.  
  1234.          if Token = Tok_Private then
  1235.             Scan; -- past PRIVATE
  1236.  
  1237.             --  Throw away the type definition node and build the type
  1238.             --  declaration node. Note the caller must set the Sloc,
  1239.             --  Discriminant_Specifications, Unknown_Discriminants_Present,
  1240.             --  and Defined_Identifier fields in the returned node.
  1241.  
  1242.             Typedecl_Node :=
  1243.               Make_Private_Extension_Declaration (No_Location,
  1244.                 Defining_Identifier => Empty,
  1245.                 Subtype_Indication  => Subtype_Indication (Typedef_Node),
  1246.                 Abstract_Present    => Abstract_Present (Typedef_Node));
  1247.  
  1248.             Delete_Node (Typedef_Node);
  1249.             return Typedecl_Node;
  1250.  
  1251.          --  Derived type definition with record extension part
  1252.  
  1253.          else
  1254.             Set_Record_Extension_Part (Typedef_Node, P_Record_Definition);
  1255.             return Typedef_Node;
  1256.          end if;
  1257.  
  1258.       --  Derived type definition with no record extension part
  1259.  
  1260.       else
  1261.          return Typedef_Node;
  1262.       end if;
  1263.    end P_Derived_Type_Def_Or_Private_Ext_Decl;
  1264.  
  1265.    ---------------------------
  1266.    -- 3.5  Range Constraint --
  1267.    ---------------------------
  1268.  
  1269.    --  RANGE_CONSTRAINT ::= range RANGE
  1270.  
  1271.    --  The caller has checked that the initial token is RANGE
  1272.  
  1273.    --  Error recovery: cannot raise Error_Resync
  1274.  
  1275.    function P_Range_Constraint return Node_Id is
  1276.       Range_Node : Node_Id;
  1277.  
  1278.    begin
  1279.       Range_Node := New_Node (N_Range_Constraint, Token_Ptr);
  1280.       Scan; -- past RANGE
  1281.       Set_Range_Expression (Range_Node, P_Range);
  1282.       return Range_Node;
  1283.    end P_Range_Constraint;
  1284.  
  1285.    ----------------
  1286.    -- 3.5  Range --
  1287.    ----------------
  1288.  
  1289.    --  RANGE ::=
  1290.    --    RANGE_ATTRIBUTE_REFERENCE | SIMPLE_EXPRESSION .. SIMPLE_EXPRESSION
  1291.  
  1292.    --  Note: the range that appears in a membership test is parsed by
  1293.    --  P_Range_Or_Subtype_Mark (3.5).
  1294.  
  1295.    --  Error recovery: cannot raise Error_Resync
  1296.  
  1297.    function P_Range return Node_Id is
  1298.       Expr_Node  : Node_Id;
  1299.       Range_Node : Node_Id;
  1300.  
  1301.    begin
  1302.       Expr_Node := P_Expression;
  1303.       Check_Simple_Expression (Expr_Node);
  1304.  
  1305.       if Token = Tok_Dot_Dot then
  1306.          Range_Node := New_Node (N_Range, Token_Ptr);
  1307.          Set_Low_Bound (Range_Node, Expr_Node);
  1308.          Scan; -- past ..
  1309.          Expr_Node := P_Expression;
  1310.          Check_Simple_Expression (Expr_Node);
  1311.          Set_High_Bound (Range_Node, Expr_Node);
  1312.          return Range_Node;
  1313.  
  1314.       --  If no double dot, must be range attribute
  1315.  
  1316.       elsif Token = Tok_Apostrophe then
  1317.          return P_Range_Attribute_Reference (Expr_Node);
  1318.  
  1319.       --  Anything else is an error
  1320.  
  1321.       else
  1322.          T_Dot_Dot; -- force missing .. message
  1323.          return Error;
  1324.       end if;
  1325.    end P_Range;
  1326.  
  1327.    ----------------------------------
  1328.    -- 3.5  P_Range_Or_Subtype_Mark --
  1329.    ----------------------------------
  1330.  
  1331.    --  RANGE ::=
  1332.    --    RANGE_ATTRIBUTE_REFERENCE
  1333.    --  | SIMPLE_EXPRESSION .. SIMPLE_EXPRESSION
  1334.  
  1335.    --  SUBTYPE_INDICATION ::= SUBTYPE_MARK [CONSTRAINT]
  1336.  
  1337.    --  This routine scans out the range or subtype mark that forms the right
  1338.    --  operand of a membership test.
  1339.  
  1340.    function P_Range_Or_Subtype_Mark return Node_Id is
  1341.       Expr_Node  : Node_Id;
  1342.       Range_Node : Node_Id;
  1343.  
  1344.    begin
  1345.       Expr_Node := P_Simple_Expression;
  1346.  
  1347.       --  Simple_Expression .. Simple_Expression as range
  1348.  
  1349.       if Token = Tok_Dot_Dot then
  1350.          Range_Node := New_Node (N_Range, Token_Ptr);
  1351.          Set_Low_Bound (Range_Node, Expr_Node);
  1352.          Scan; -- past ..
  1353.          Set_High_Bound (Range_Node, P_Simple_Expression);
  1354.          return Range_Node;
  1355.  
  1356.       --  If no double dot, could be range attribute
  1357.  
  1358.       elsif Token = Tok_Apostrophe then
  1359.          return P_Range_Attribute_Reference (Expr_Node);
  1360.  
  1361.       --  Case of subtype mark (optionally qualified simple name or an
  1362.       --  attribute whose prefix is an optionally qualifed simple name)
  1363.  
  1364.       elsif Expr_Form = EF_Simple_Name
  1365.         or else Nkind (Expr_Node) = N_Attribute_Reference
  1366.       then
  1367.          --  Check for error of range constraint after a subtype mark
  1368.  
  1369.          if Token = Tok_Range then
  1370.             Error_Msg_SC
  1371.               ("range constraint not allowed in membership test");
  1372.             Scan; -- past RANGE
  1373.             raise Error_Resync;
  1374.  
  1375.          --  Check for error of DIGITS or DELTA after a subtype mark
  1376.  
  1377.          elsif Token = Tok_Digits or else Token = Tok_Delta then
  1378.             Error_Msg_SC
  1379.                ("accuracy definition not allowed in membership test");
  1380.             Scan; -- past DIGITS or DELTA
  1381.             raise Error_Resync;
  1382.  
  1383.          elsif Token = Tok_Apostrophe then
  1384.             return P_Subtype_Mark_Attribute (Expr_Node);
  1385.  
  1386.          else
  1387.             return Expr_Node;
  1388.          end if;
  1389.  
  1390.       --  For other cases (call, non-simple name, qualified expression), we
  1391.       --  assume that we have a missing .. (as reasonable an error as any!)
  1392.  
  1393.       else
  1394.          T_Dot_Dot;  -- give .. expected message
  1395.          raise Error_Resync;
  1396.       end if;
  1397.    end P_Range_Or_Subtype_Mark;
  1398.  
  1399.    ----------------------------------------
  1400.    -- 3.5.1  Enumeration Type Definition --
  1401.    ----------------------------------------
  1402.  
  1403.    --  ENUMERATION_TYPE_DEFINITION ::=
  1404.    --    (ENUMERATION_LITERAL_SPECIFICATION
  1405.    --      {, ENUMERATION_LITERAL_SPECIFICATION})
  1406.  
  1407.    --  The caller has already scanned out the TYPE keyword
  1408.  
  1409.    --  Error recovery: can raise Error_Resync;
  1410.  
  1411.    function P_Enumeration_Type_Definition return Node_Id is
  1412.       Typedef_Node : Node_Id;
  1413.  
  1414.    begin
  1415.       Typedef_Node := New_Node (N_Enumeration_Type_Definition, Token_Ptr);
  1416.       Set_Literals (Typedef_Node, New_List);
  1417.  
  1418.       T_Left_Paren;
  1419.  
  1420.       loop
  1421.          Append (P_Enumeration_Literal_Specification, Literals (Typedef_Node));
  1422.          exit when not Comma_Present;
  1423.       end loop;
  1424.  
  1425.       T_Right_Paren;
  1426.       return Typedef_Node;
  1427.    end P_Enumeration_Type_Definition;
  1428.  
  1429.    ----------------------------------------------
  1430.    -- 3.5.1  Enumeration Literal Specification --
  1431.    ----------------------------------------------
  1432.  
  1433.    --  ENUMERATION_LITERAL_SPECIFICATION ::=
  1434.    --    DEFINING_IDENTIFIER | DEFINING_CHARACTER_LITERAL
  1435.  
  1436.    --  Error recovery: can raise Error_Resync
  1437.  
  1438.    function P_Enumeration_Literal_Specification return Node_Id is
  1439.    begin
  1440.       if Token = Tok_Char_Literal then
  1441.          return P_Defining_Character_Literal;
  1442.       else
  1443.          return P_Defining_Identifier;
  1444.       end if;
  1445.    end P_Enumeration_Literal_Specification;
  1446.  
  1447.    ---------------------------------------
  1448.    -- 3.5.1  Defining_Character_Literal --
  1449.    ---------------------------------------
  1450.  
  1451.    --  DEFINING_CHARACTER_LITERAL ::= CHARACTER_LITERAL
  1452.  
  1453.    --  Error recovery: cannot raise Error_Resync
  1454.  
  1455.    --  The caller has checked that the current token is a character literal
  1456.  
  1457.    function P_Defining_Character_Literal return Node_Id is
  1458.       Literal_Node : Node_Id;
  1459.  
  1460.    begin
  1461.       Literal_Node := Token_Node;
  1462.       Change_Character_Literal_To_Defining_Character_Literal (Literal_Node);
  1463.       Scan; -- past character literal
  1464.       return Literal_Node;
  1465.    end P_Defining_Character_Literal;
  1466.  
  1467.    ------------------------------------
  1468.    -- 3.5.4  Integer Type Definition --
  1469.    ------------------------------------
  1470.  
  1471.    --  Parsed by P_Type_Declaration (3.2.1)
  1472.  
  1473.    -------------------------------------------
  1474.    -- 3.5.4  Signed Integer Type Definition --
  1475.    -------------------------------------------
  1476.  
  1477.    --  SIGNED_INTEGER_TYPE_DEFINITION ::=
  1478.    --    range static_SIMPLE_EXPRESSION .. static_SIMPLE_EXPRESSION
  1479.  
  1480.    --  The caller has checked that the initial token is RANGE
  1481.  
  1482.    --  Error recovery: cannot raise Error_Resync
  1483.  
  1484.    function P_Signed_Integer_Type_Definition return Node_Id is
  1485.       Typedef_Node : Node_Id;
  1486.       Expr_Node    : Node_Id;
  1487.  
  1488.    begin
  1489.       Typedef_Node := New_Node (N_Signed_Integer_Type_Definition, Token_Ptr);
  1490.       Scan; -- past RANGE
  1491.       Expr_Node := P_Expression;
  1492.       Check_Simple_Expression (Expr_Node);
  1493.       Set_Low_Bound (Typedef_Node, Expr_Node);
  1494.       T_Dot_Dot;
  1495.       Expr_Node := P_Expression;
  1496.       Check_Simple_Expression (Expr_Node);
  1497.       Set_High_Bound (Typedef_Node, Expr_Node);
  1498.       return Typedef_Node;
  1499.    end P_Signed_Integer_Type_Definition;
  1500.  
  1501.    ------------------------------------
  1502.    -- 3.5.4  Modular Type Definition --
  1503.    ------------------------------------
  1504.  
  1505.    --  MODULAR_TYPE_DEFINITION ::= mod static_EXPRESSION
  1506.  
  1507.    --  The caller has checked that the initial token is MOD
  1508.  
  1509.    --  Error recovery: cannot raise Error_Resync
  1510.  
  1511.    function P_Modular_Type_Definition return Node_Id is
  1512.       Typedef_Node : Node_Id;
  1513.  
  1514.    begin
  1515.       if Ada_83 then
  1516.          Error_Msg_SC ("(Ada 83): modular types not allowed");
  1517.       end if;
  1518.  
  1519.       Note_Feature (Modular_Integer_Types, Token_Ptr);
  1520.       Typedef_Node := New_Node (N_Modular_Type_Definition, Token_Ptr);
  1521.       Scan; -- past MOD
  1522.       Set_Expression (Typedef_Node, P_Expression_No_Right_Paren);
  1523.  
  1524.       --  Handle mod L..R cleanly
  1525.  
  1526.       if Token = Tok_Dot_Dot then
  1527.          Error_Msg_SC ("range not allowed for modular type");
  1528.          Scan; -- past ..
  1529.          Set_Expression (Typedef_Node, P_Expression_No_Right_Paren);
  1530.       end if;
  1531.  
  1532.       return Typedef_Node;
  1533.    end P_Modular_Type_Definition;
  1534.  
  1535.    ---------------------------------
  1536.    -- 3.5.6  Real Type Definition --
  1537.    ---------------------------------
  1538.  
  1539.    --  Parsed by P_Type_Declaration (3.2.1)
  1540.  
  1541.    --------------------------------------
  1542.    -- 3.5.7  Floating Point Definition --
  1543.    --------------------------------------
  1544.  
  1545.    --  FLOATING_POINT_DEFINITION ::=
  1546.    --    digits static_EXPRESSION [REAL_RANGE_SPECIFICATION]
  1547.  
  1548.    --  Note: In Ada-83, the EXPRESSION must be a SIMPLE_EXPRESSION
  1549.  
  1550.    --  The caller has checked that the initial token is DIGITS
  1551.  
  1552.    --  Error recovery: cannot raise Error_Resync
  1553.  
  1554.    function P_Floating_Point_Definition return Node_Id is
  1555.       Digits_Loc : constant Source_Ptr := Token_Ptr;
  1556.       Def_Node   : Node_Id;
  1557.       Expr_Node  : Node_Id;
  1558.  
  1559.    begin
  1560.       Scan; -- past DIGITS
  1561.       Expr_Node := P_Expression_No_Right_Paren;
  1562.       Check_Simple_Expression_In_Ada_83 (Expr_Node);
  1563.  
  1564.       --  Handle decimal fixed-point defn with DIGITS/DELTA in wrong order
  1565.  
  1566.       if Token = Tok_Delta then
  1567.          Error_Msg_SC ("DELTA comes before DIGITS, not after");
  1568.          Def_Node := New_Node (N_Decimal_Fixed_Point_Definition, Digits_Loc);
  1569.          Scan; -- past DELTA
  1570.          Set_Delta_Expression (Def_Node, P_Expression_No_Right_Paren);
  1571.  
  1572.       --  OK floating-point definition
  1573.  
  1574.       else
  1575.          Def_Node := New_Node (N_Floating_Point_Definition, Digits_Loc);
  1576.       end if;
  1577.  
  1578.       Set_Digits_Expression (Def_Node, Expr_Node);
  1579.       Set_Real_Range_Specification (Def_Node, P_Real_Range_Specification_Opt);
  1580.       return Def_Node;
  1581.    end P_Floating_Point_Definition;
  1582.  
  1583.    -------------------------------------
  1584.    -- 3.5.7  Real Range Specification --
  1585.    -------------------------------------
  1586.  
  1587.    --  REAL_RANGE_SPECIFICATION ::=
  1588.    --    range static_SIMPLE_EXPRESSION .. static_SIMPLE_EXPRESSION
  1589.  
  1590.    --  Error recovery: cannot raise Error_Resync
  1591.  
  1592.    function P_Real_Range_Specification_Opt return Node_Id is
  1593.       Specification_Node : Node_Id;
  1594.       Expr_Node          : Node_Id;
  1595.  
  1596.    begin
  1597.       if Token = Tok_Range then
  1598.          Specification_Node :=
  1599.            New_Node (N_Real_Range_Specification, Token_Ptr);
  1600.          Scan; -- past RANGE
  1601.          Expr_Node := P_Expression_No_Right_Paren;
  1602.          Check_Simple_Expression (Expr_Node);
  1603.          Set_Low_Bound (Specification_Node, Expr_Node);
  1604.          T_Dot_Dot;
  1605.          Expr_Node := P_Expression_No_Right_Paren;
  1606.          Check_Simple_Expression (Expr_Node);
  1607.          Set_High_Bound (Specification_Node, Expr_Node);
  1608.          return Specification_Node;
  1609.       else
  1610.          return Empty;
  1611.       end if;
  1612.    end P_Real_Range_Specification_Opt;
  1613.  
  1614.    -----------------------------------
  1615.    -- 3.5.9  Fixed Point Definition --
  1616.    -----------------------------------
  1617.  
  1618.    --  FIXED_POINT_DEFINITION ::=
  1619.    --    ORDINARY_FIXED_POINT_DEFINITION | DECIMAL_FIXED_POINT_DEFINITION
  1620.  
  1621.    --  ORDINARY_FIXED_POINT_DEFINITION ::=
  1622.    --    delta static_EXPRESSION REAL_RANGE_SPECIFICATION
  1623.  
  1624.    --  DECIMAL_FIXED_POINT_DEFINITION ::=
  1625.    --    delta static_EXPRESSION
  1626.    --      digits static_EXPRESSION [REAL_RANGE_SPECIFICATION]
  1627.  
  1628.    --  The caller has checked that the initial token is DELTA
  1629.  
  1630.    --  Error recovery: cannot raise Error_Resync
  1631.  
  1632.    function P_Fixed_Point_Definition return Node_Id is
  1633.       Delta_Node : Node_Id;
  1634.       Delta_Loc  : Source_Ptr;
  1635.       Def_Node   : Node_Id;
  1636.       Expr_Node  : Node_Id;
  1637.  
  1638.    begin
  1639.       Delta_Loc := Token_Ptr;
  1640.       Scan; -- past DELTA
  1641.       Delta_Node := P_Expression_No_Right_Paren;
  1642.       Check_Simple_Expression_In_Ada_83 (Delta_Node);
  1643.  
  1644.       if Token = Tok_Digits then
  1645.          if Ada_83 then
  1646.             Error_Msg_SC ("(Ada 83) decimal fixed type not allowed!");
  1647.          end if;
  1648.  
  1649.          Def_Node := New_Node (N_Decimal_Fixed_Point_Definition, Delta_Loc);
  1650.          Note_Feature (Decimal_Fixed_Point, Token_Ptr);
  1651.          Scan; -- past DIGITS
  1652.          Expr_Node := P_Expression_No_Right_Paren;
  1653.          Check_Simple_Expression_In_Ada_83 (Expr_Node);
  1654.          Set_Digits_Expression (Def_Node, Expr_Node);
  1655.  
  1656.       else
  1657.          Def_Node := New_Node (N_Ordinary_Fixed_Point_Definition, Delta_Loc);
  1658.  
  1659.          --  Range is required in ordinary fixed point case
  1660.  
  1661.          if Token /= Tok_Range then
  1662.             Error_Msg_AP ("range must be given for fixed-point type");
  1663.             T_Range;
  1664.          end if;
  1665.       end if;
  1666.  
  1667.       Set_Delta_Expression (Def_Node, Delta_Node);
  1668.       Set_Real_Range_Specification (Def_Node, P_Real_Range_Specification_Opt);
  1669.       return Def_Node;
  1670.    end P_Fixed_Point_Definition;
  1671.  
  1672.    --------------------------------------------
  1673.    -- 3.5.9  Ordinary Fixed Point Definition --
  1674.    --------------------------------------------
  1675.  
  1676.    --  Parsed by P_Fixed_Point_Definition (3.5.9)
  1677.  
  1678.    -------------------------------------------
  1679.    -- 3.5.9  Decimal Fixed Point Definition --
  1680.    -------------------------------------------
  1681.  
  1682.    --  Parsed by P_Decimal_Point_Definition (3.5.9)
  1683.  
  1684.    ------------------------------
  1685.    -- 3.5.9  Digits Constraint --
  1686.    ------------------------------
  1687.  
  1688.    --  DIGITS_CONSTRAINT ::=
  1689.    --    digits static_EXPRESSION [RANGE_CONSTRAINT]
  1690.  
  1691.    --  Note: in Ada 83, the EXPRESSION must be a SIMPLE_EXPRESSION
  1692.  
  1693.    --  The caller has checked that the initial token is DIGITS
  1694.  
  1695.    function P_Digits_Constraint return Node_Id is
  1696.       Constraint_Node : Node_Id;
  1697.       Expr_Node : Node_Id;
  1698.  
  1699.    begin
  1700.       Constraint_Node := New_Node (N_Digits_Constraint, Token_Ptr);
  1701.       Scan; -- past DIGITS
  1702.       Expr_Node := P_Expression_No_Right_Paren;
  1703.       Check_Simple_Expression_In_Ada_83 (Expr_Node);
  1704.       Set_Digits_Expression (Constraint_Node, Expr_Node);
  1705.  
  1706.       if Token = Tok_Range then
  1707.          Set_Range_Constraint (Constraint_Node, P_Range_Constraint);
  1708.       end if;
  1709.  
  1710.       return Constraint_Node;
  1711.    end P_Digits_Constraint;
  1712.  
  1713.    -----------------------------
  1714.    -- 3.5.9  Delta Constraint --
  1715.    -----------------------------
  1716.  
  1717.    --  DELTA CONSTRAINT ::= DELTA STATIC_EXPRESSION [RANGE_CONSTRAINT]
  1718.  
  1719.    --  Note: this is an obsolescent feature in Ada 95 (I.3)
  1720.  
  1721.    --  Note: in Ada 83, the EXPRESSION must be a SIMPLE_EXPRESSION
  1722.  
  1723.    --  The caller has checked that the initial token is DELTA
  1724.  
  1725.    --  Error recovery: cannot raise Error_Resync
  1726.  
  1727.    function P_Delta_Constraint return Node_Id is
  1728.       Constraint_Node : Node_Id;
  1729.       Expr_Node : Node_Id;
  1730.  
  1731.    begin
  1732.       Constraint_Node := New_Node (N_Delta_Constraint, Token_Ptr);
  1733.       Scan; -- past DELTA
  1734.       Expr_Node := P_Expression_No_Right_Paren;
  1735.       Check_Simple_Expression_In_Ada_83 (Expr_Node);
  1736.       Set_Delta_Expression (Constraint_Node, Expr_Node);
  1737.  
  1738.       if Token = Tok_Range then
  1739.          Set_Range_Constraint (Constraint_Node, P_Range_Constraint);
  1740.       end if;
  1741.  
  1742.       return Constraint_Node;
  1743.    end P_Delta_Constraint;
  1744.  
  1745.    --------------------------------
  1746.    -- 3.6  Array Type Definition --
  1747.    --------------------------------
  1748.  
  1749.    --  ARRAY_TYPE_DEFINITION ::=
  1750.    --    UNCONSTRAINED_ARRAY_DEFINITION | CONSTRAINED_ARRAY_DEFINITION
  1751.  
  1752.    --  UNCONSTRAINED_ARRAY_DEFINITION ::=
  1753.    --    array (INDEX_SUBTYPE_DEFINITION {, INDEX_SUBTYPE_DEFINITION}) of
  1754.    --      COMPONENT_DEFINITION
  1755.  
  1756.    --  INDEX_SUBTYPE_DEFINITION ::= SUBTYPE_MARK range <>
  1757.  
  1758.    --  CONSTRAINED_ARRAY_DEFINITION ::=
  1759.    --    array (DISCRETE_SUBTYPE_DEFINITION {, DISCRETE_SUBTYPE_DEFINITION}) of
  1760.    --      COMPONENT_DEFINITION
  1761.  
  1762.    --  DISCRETE_SUBTYPE_DEFINITION ::=
  1763.    --    DISCRETE_SUBTYPE_INDICATION | RANGE
  1764.  
  1765.    --  COMPONENT_DEFINITION ::= [aliased] SUBTYPE_INDICATION
  1766.  
  1767.    --  The caller has checked that the initial token is ARRAY
  1768.  
  1769.    --  Error recovery: can raise Error_Resync
  1770.  
  1771.    function P_Array_Type_Definition return Node_Id is
  1772.       Array_Loc  : Source_Ptr;
  1773.       Def_Node   : Node_Id;
  1774.       Subs_List  : List_Id;
  1775.       Scan_State : Saved_Scan_State;
  1776.  
  1777.    begin
  1778.       Array_Loc := Token_Ptr;
  1779.       Scan; -- past ARRAY
  1780.       Subs_List := New_List;
  1781.       T_Left_Paren;
  1782.  
  1783.       --  It's quite tricky to disentangle these two possibilities, so we do
  1784.       --  a prescan to determine which case we have and then reset the scan.
  1785.       --  The prescan skips past possible subtype mark tokens.
  1786.  
  1787.       Save_Scan_State (Scan_State); -- just after paren
  1788.  
  1789.       while Token in Token_Class_Desig or else
  1790.             Token = Tok_Dot or else
  1791.             Token = Tok_Apostrophe -- because of 'BASE, 'CLASS
  1792.       loop
  1793.          Scan;
  1794.       end loop;
  1795.  
  1796.       --  If we end up on RANGE <> then we have the unconstrained case. We
  1797.       --  will also allow the RANGE to be omitted, just to improve error
  1798.       --  handling for a case like array (integer <>) of integer;
  1799.  
  1800.       Scan; -- past possible RANGE or <>
  1801.  
  1802.       if (Prev_Token = Tok_Range and then Token = Tok_Box) or else
  1803.          Prev_Token = Tok_Box
  1804.       then
  1805.          Def_Node := New_Node (N_Unconstrained_Array_Definition, Array_Loc);
  1806.          Restore_Scan_State (Scan_State); -- to first subtype mark
  1807.  
  1808.          loop
  1809.             Append (P_Subtype_Mark_Resync, Subs_List);
  1810.             T_Range;
  1811.             T_Box;
  1812.             exit when Token = Tok_Right_Paren or else Token = Tok_Of;
  1813.             T_Comma;
  1814.          end loop;
  1815.  
  1816.          Set_Subtype_Marks (Def_Node, Subs_List);
  1817.  
  1818.       else
  1819.          Def_Node := New_Node (N_Constrained_Array_Definition, Array_Loc);
  1820.          Restore_Scan_State (Scan_State); -- to first discrete range
  1821.  
  1822.          loop
  1823.             Append (P_Discrete_Subtype_Definition, Subs_List);
  1824.             exit when not Comma_Present;
  1825.          end loop;
  1826.  
  1827.          Set_Discrete_Subtype_Definitions (Def_Node, Subs_List);
  1828.       end if;
  1829.  
  1830.       T_Right_Paren;
  1831.       T_Of;
  1832.  
  1833.       if Token = Tok_Aliased then
  1834.          Note_Feature (Aliased_Objects, Token_Ptr);
  1835.          Set_Aliased_Present (Def_Node, True);
  1836.          Scan; -- past ALIASED
  1837.       end if;
  1838.  
  1839.       Set_Subtype_Indication (Def_Node, P_Subtype_Indication);
  1840.       return Def_Node;
  1841.    end P_Array_Type_Definition;
  1842.  
  1843.    -----------------------------------------
  1844.    -- 3.6  Unconstrained Array Definition --
  1845.    -----------------------------------------
  1846.  
  1847.    --  Parsed by P_Array_Type_Definition (3.6)
  1848.  
  1849.    ---------------------------------------
  1850.    -- 3.6  Constrained Array Definition --
  1851.    ---------------------------------------
  1852.  
  1853.    --  Parsed by P_Array_Type_Definition (3.6)
  1854.  
  1855.    --------------------------------------
  1856.    -- 3.6  Discrete Subtype Definition --
  1857.    --------------------------------------
  1858.  
  1859.    --  DISCRETE_SUBTYPE_DEFINITION ::=
  1860.    --    discrete_SUBTYPE_INDICATION | RANGE
  1861.  
  1862.    --  Note: the discrete subtype definition appearing in a constrained
  1863.    --  array definition is parsed by P_Array_Type_Definition (3.6)
  1864.  
  1865.    --  Error recovery: cannot raise Error_Resync
  1866.  
  1867.    function P_Discrete_Subtype_Definition return Node_Id is
  1868.    begin
  1869.  
  1870.       --  The syntax of a discrete subtype definition is identical to that
  1871.       --  of a discrete range, so we simply share the same parsing code.
  1872.  
  1873.       return P_Discrete_Range;
  1874.    end P_Discrete_Subtype_Definition;
  1875.  
  1876.    -------------------------------
  1877.    -- 3.6  Component Definition --
  1878.    -------------------------------
  1879.  
  1880.    --  For the array case, parsed by P_Array_Type_Definition (3.6)
  1881.    --  For the record case, parsed by P_Component_Declaration (3.8)
  1882.  
  1883.    -----------------------------
  1884.    -- 3.6.1  Index Constraint --
  1885.    -----------------------------
  1886.  
  1887.    --  Parsed by P_Index_Or_Discriminant_Constraint (3.7.1)
  1888.  
  1889.    ---------------------------
  1890.    -- 3.6.1  Discrete Range --
  1891.    ---------------------------
  1892.  
  1893.    --  DISCRETE_RANGE ::= discrete_SUBTYPE_INDICATION | RANGE
  1894.  
  1895.    --  The possible forms for a discrete range are:
  1896.  
  1897.       --   Subtype_Mark                           (SUBTYPE_INDICATION, 3.2.2)
  1898.       --   Subtype_Mark range Range               (SUBTYPE_INDICATION, 3.2.2)
  1899.       --   Range_Attribute                        (RANGE, 3.5)
  1900.       --   Simple_Expression .. Simple_Expression (RANGE, 3.5)
  1901.  
  1902.    --  Error recovery: cannot raise Error_Resync
  1903.  
  1904.    function P_Discrete_Range return Node_Id is
  1905.       Expr_Node  : Node_Id;
  1906.       Range_Node : Node_Id;
  1907.  
  1908.    begin
  1909.       Expr_Node := P_Expression;
  1910.       Check_Simple_Expression (Expr_Node);
  1911.  
  1912.       if Token = Tok_Range then
  1913.          if Expr_Form /= EF_Simple_Name then
  1914.             Error_Msg_SC ("range must be preceded by subtype mark");
  1915.          end if;
  1916.  
  1917.          return P_Subtype_Indication (Expr_Node);
  1918.  
  1919.       --  All set if range attribute scanned
  1920.  
  1921.       elsif Token = Tok_Apostrophe then
  1922.          return P_Range_Attribute_Reference (Expr_Node);
  1923.  
  1924.       --  Check Expression .. Expression case
  1925.  
  1926.       elsif Token = Tok_Dot_Dot then
  1927.          Range_Node := New_Node (N_Range, Token_Ptr);
  1928.          Set_Low_Bound (Range_Node, Expr_Node);
  1929.          Scan; -- past ..
  1930.          Expr_Node := P_Expression;
  1931.          Check_Simple_Expression (Expr_Node);
  1932.          Set_High_Bound (Range_Node, Expr_Node);
  1933.          return Range_Node;
  1934.  
  1935.       --  Otherwise we must have a subtype mark
  1936.  
  1937.       elsif Expr_Form = EF_Simple_Name then
  1938.          return Expr_Node;
  1939.  
  1940.       --  If incorrect, complain that we expect ..
  1941.  
  1942.       else
  1943.          T_Dot_Dot;
  1944.          return Expr_Node;
  1945.       end if;
  1946.    end P_Discrete_Range;
  1947.  
  1948.    ----------------------------
  1949.    -- 3.7  Discriminant Part --
  1950.    ----------------------------
  1951.  
  1952.    --  DISCRIMINANT_PART ::=
  1953.    --    UNKNOWN_DISCRIMINANT_PART
  1954.    --  | KNOWN_DISCRIMINANT_PART
  1955.  
  1956.    --  A discriminant part is parsed by P_Known_Discriminant_Part_Opt (3.7)
  1957.    --  or P_Unknown_Discriminant_Part (3.7), since we know which we want.
  1958.  
  1959.    ------------------------------------
  1960.    -- 3.7  Unknown Discriminant Part --
  1961.    ------------------------------------
  1962.  
  1963.    --  UNKNOWN_DISCRIMINANT_PART ::= (<>)
  1964.  
  1965.    --  If no unknown discriminant part is present, then False is returned,
  1966.    --  otherwise the unknown discriminant is scanned out and True is returned.
  1967.  
  1968.    --  Error recovery: cannot raise Error_Resync
  1969.  
  1970.    function P_Unknown_Discriminant_Part_Opt return Boolean is
  1971.       Scan_State : Saved_Scan_State;
  1972.  
  1973.    begin
  1974.       if Token /= Tok_Left_Paren then
  1975.          return False;
  1976.  
  1977.       else
  1978.          Save_Scan_State (Scan_State);
  1979.          Scan; -- past the left paren
  1980.  
  1981.          if Token = Tok_Box then
  1982.  
  1983.             if Ada_83 then
  1984.                Error_Msg_SC ("(Ada 83) unknown discriminant not allowed!");
  1985.             end if;
  1986.  
  1987.             Note_Feature (Unknown_Discriminant_Parts, Token_Ptr);
  1988.             Scan; -- past the box
  1989.             T_Right_Paren; -- must be followed by right paren
  1990.             return True;
  1991.  
  1992.          else
  1993.             Restore_Scan_State (Scan_State);
  1994.             return False;
  1995.          end if;
  1996.       end if;
  1997.    end P_Unknown_Discriminant_Part_Opt;
  1998.  
  1999.    ----------------------------------
  2000.    -- 3.7  Known Discriminant Part --
  2001.    ----------------------------------
  2002.  
  2003.    --  KNOWN_DISCRIMINANT_PART ::=
  2004.    --    (DISCRIMINANT_SPECIFICATION {; DISCRIMINANT_SPECIFICATION})
  2005.  
  2006.    --  DISCRIMINANT_SPECIFICATION ::=
  2007.    --    DEFINING_IDENTIFIER_LIST : SUBTYPE_MARK
  2008.    --      [:= DEFAULT_EXPRESSION]
  2009.    --  | DEFINING_IDENTIFIER_LIST : ACCESS_DEFINITION
  2010.    --      [:= DEFAULT_EXPRESSION]
  2011.  
  2012.    --  If no known discriminant part is present, then No_List is returned
  2013.  
  2014.    --  Error recovery: cannot raise Error_Resync
  2015.  
  2016.    function P_Known_Discriminant_Part_Opt return List_Id is
  2017.       Specification_Node : Node_Id;
  2018.       Specification_List : List_Id;
  2019.       Ident_Sloc         : Source_Ptr;
  2020.       Scan_State         : Saved_Scan_State;
  2021.       Num_Idents         : Nat;
  2022.       Ident              : Nat;
  2023.  
  2024.       Idents : array (Int range 1 .. 4096) of Entity_Id;
  2025.       --  This array holds the list of defining identifiers. The upper bound
  2026.       --  of 4096 is intended to be essentially infinite, and we do not even
  2027.       --  bother to check for it being exceeded.
  2028.  
  2029.    begin
  2030.       if Token = Tok_Left_Paren then
  2031.          Specification_List := New_List;
  2032.          Scan; -- past (
  2033.          P_Pragmas_Misplaced;
  2034.  
  2035.          Specification_Loop : loop
  2036.  
  2037.             Ident_Sloc := Token_Ptr;
  2038.             Idents (1) := P_Defining_Identifier;
  2039.             Num_Idents := 1;
  2040.  
  2041.             while Comma_Present loop
  2042.                Num_Idents := Num_Idents + 1;
  2043.                Idents (Num_Idents) := P_Defining_Identifier;
  2044.             end loop;
  2045.  
  2046.             T_Colon;
  2047.  
  2048.             --  If there are multiple identifiers, we repeatedly scan the
  2049.             --  type and initialization expression information by resetting
  2050.             --  the scan pointer (so that we get completely separate trees
  2051.             --  for each occurrence).
  2052.  
  2053.             if Num_Idents > 1 then
  2054.                Save_Scan_State (Scan_State);
  2055.             end if;
  2056.  
  2057.             --  Loop through defining identifiers in list
  2058.  
  2059.             Ident := 1;
  2060.             Ident_Loop : loop
  2061.                Specification_Node :=
  2062.                  New_Node (N_Discriminant_Specification, Ident_Sloc);
  2063.                Set_Defining_Identifier (Specification_Node, Idents (Ident));
  2064.  
  2065.                if Token = Tok_Access then
  2066.                   if Ada_83 then
  2067.                      Error_Msg_SC
  2068.                        ("(Ada 83) access discriminant not allowed!");
  2069.                   end if;
  2070.  
  2071.                   Note_Feature (Access_Discriminants, Token_Ptr);
  2072.                   Set_Discriminant_Type
  2073.                     (Specification_Node, P_Access_Definition);
  2074.                else
  2075.                   Set_Discriminant_Type
  2076.                     (Specification_Node, P_Subtype_Mark);
  2077.                   No_Constraint;
  2078.                end if;
  2079.  
  2080.                Set_Expression
  2081.                  (Specification_Node, Init_Expr_Opt (True));
  2082.  
  2083.                if Ident > 1 then
  2084.                   Set_Prev_Ids (Specification_Node, True);
  2085.                end if;
  2086.  
  2087.                if Ident < Num_Idents then
  2088.                   Set_More_Ids (Specification_Node, True);
  2089.                end if;
  2090.  
  2091.                Append (Specification_Node, Specification_List);
  2092.                exit Ident_Loop when Ident = Num_Idents;
  2093.                Ident := Ident + 1;
  2094.                Restore_Scan_State (Scan_State);
  2095.             end loop Ident_Loop;
  2096.  
  2097.             exit Specification_Loop when Token /= Tok_Semicolon;
  2098.             Scan; -- past ;
  2099.             P_Pragmas_Misplaced;
  2100.          end loop Specification_Loop;
  2101.  
  2102.          T_Right_Paren;
  2103.          return Specification_List;
  2104.  
  2105.       else
  2106.          return No_List;
  2107.       end if;
  2108.    end P_Known_Discriminant_Part_Opt;
  2109.  
  2110.    -------------------------------------
  2111.    -- 3.7  DIscriminant Specification --
  2112.    -------------------------------------
  2113.  
  2114.    --  Parsed by P_Known_Discriminant_Part_Opt (3.7)
  2115.  
  2116.    -----------------------------
  2117.    -- 3.7  Default Expression --
  2118.    -----------------------------
  2119.  
  2120.    --  Always parsed (simply as an Expression) by the parent construct
  2121.  
  2122.    ------------------------------------
  2123.    -- 3.7.1  Discriminant Constraint --
  2124.    ------------------------------------
  2125.  
  2126.    --  Parsed by P_Index_Or_Discriminant_Constraint (3.7.1)
  2127.  
  2128.    --------------------------------------------------------
  2129.    -- 3.7.1  Index or Discriminant Constraint (also 3.6) --
  2130.    --------------------------------------------------------
  2131.  
  2132.    --  DISCRIMINANT_CONSTRAINT ::=
  2133.    --    (DISCRIMINANT_ASSOCIATION {, DISCRIMINANT_ASSOCIATION})
  2134.  
  2135.    --  DISCRIMINANT_ASSOCIATION ::=
  2136.    --    [discriminant_SELECTOR_NAME {| discriminant_SELECTOR_NAME} =>]
  2137.    --      EXPRESSION
  2138.  
  2139.    --  This routine parses either an index or a discriminant constraint. As
  2140.    --  is clear from the above grammar, it is often possible to clearly
  2141.    --  determine which of the two possibilities we have, but there are
  2142.    --  cases (those in which we have a series of expressions of the same
  2143.    --  syntactic form as subtype indications), where we cannot tell. Since
  2144.    --  this means that in any case the semantic phase has to distinguish
  2145.    --  between the two, there is not much point in the parser trying to
  2146.    --  distinguish even those cases where the difference is clear. In any
  2147.    --  case, if we have a situation like:
  2148.  
  2149.    --     (A => 123, 235 .. 500)
  2150.  
  2151.    --  it is not clear which of the two items is the wrong one, better to
  2152.    --  let the semantic phase give a clear message. Consequently, this
  2153.    --  routine in general returns a list of items which can be either
  2154.    --  discrete ranges or discriminant associations.
  2155.  
  2156.    --  The caller has checked that the initial token is a left paren
  2157.  
  2158.    --  Error recovery: can raise Error_Resync
  2159.  
  2160.    function P_Index_Or_Discriminant_Constraint return Node_Id is
  2161.       Scan_State  : Saved_Scan_State;
  2162.       Constr_Node : Node_Id;
  2163.       Constr_List : List_Id;
  2164.       Expr_Node   : Node_Id;
  2165.       Result_Node : Node_Id;
  2166.  
  2167.    begin
  2168.       Result_Node := New_Node (N_Index_Or_Discriminant_Constraint, Token_Ptr);
  2169.       Scan; -- past (
  2170.       Constr_List := New_List;
  2171.       Set_Constraints (Result_Node, Constr_List);
  2172.  
  2173.       --  The two syntactic forms are a little mixed up, so what we are doing
  2174.       --  here is looking at the first entry to determine which case we have
  2175.  
  2176.       --  A discriminant constraint is a list of discriminant associations,
  2177.       --  which have one of the following possible forms:
  2178.  
  2179.       --    Expression
  2180.       --    Id => Expression
  2181.       --    Id | Id | .. | Id => Expression
  2182.  
  2183.       --  An index constraint is a list of discrete ranges which have one
  2184.       --  of the following possible forms:
  2185.  
  2186.       --    Subtype_Mark
  2187.       --    Subtype_Mark range Range
  2188.       --    Range_Attribute
  2189.       --    Simple_Expression .. Simple_Expression
  2190.  
  2191.       --  Loop through discriminants in list
  2192.  
  2193.       loop
  2194.          --  Check cases of Id => Expression or Id | Id => Expression
  2195.  
  2196.          if Token = Tok_Identifier then
  2197.             Save_Scan_State (Scan_State); -- at Id
  2198.             Scan; -- past Id
  2199.  
  2200.             if Token = Tok_Arrow or else Token = Tok_Vertical_Bar then
  2201.                Restore_Scan_State (Scan_State); -- to Id
  2202.                Append (P_Discriminant_Association, Constr_List);
  2203.                goto Loop_Continue;
  2204.             else
  2205.                Restore_Scan_State (Scan_State); -- to Id
  2206.             end if;
  2207.          end if;
  2208.  
  2209.          --  Otherwise scan out an expression and see what we have got
  2210.  
  2211.          Expr_Node := P_Expression;
  2212.  
  2213.          --  Check range constraint
  2214.  
  2215.          if Token = Tok_Range then
  2216.             if Expr_Form /= EF_Simple_Name then
  2217.                Error_Msg_SC ("subtype mark required before RANGE");
  2218.             end if;
  2219.  
  2220.             Append (P_Subtype_Indication (Expr_Node), Constr_List);
  2221.             goto Loop_Continue;
  2222.  
  2223.          --  Check range attribute
  2224.  
  2225.          elsif Token = Tok_Apostrophe then
  2226.             Append (P_Range_Attribute_Reference (Expr_Node), Constr_List);
  2227.             goto Loop_Continue;
  2228.  
  2229.          --  Check Simple_Expression .. Simple_Expression case
  2230.  
  2231.          elsif Token = Tok_Dot_Dot then
  2232.             Check_Simple_Expression (Expr_Node);
  2233.  
  2234.             Constr_Node := New_Node (N_Range, Token_Ptr);
  2235.             Set_Low_Bound (Constr_Node, Expr_Node);
  2236.             Scan; -- past ..
  2237.             Expr_Node := P_Expression;
  2238.             Check_Simple_Expression (Expr_Node);
  2239.             Set_High_Bound (Constr_Node, Expr_Node);
  2240.             Append (Constr_Node, Constr_List);
  2241.             goto Loop_Continue;
  2242.  
  2243.          --  Case of an expression which could be either form
  2244.  
  2245.          else
  2246.             Append (Expr_Node, Constr_List);
  2247.             goto Loop_Continue;
  2248.          end if;
  2249.  
  2250.          --  Here with a single entry scanned
  2251.  
  2252.          <<Loop_Continue>>
  2253.             exit when not Comma_Present;
  2254.  
  2255.       end loop;
  2256.  
  2257.       Scan; -- past right paren
  2258.       return Result_Node;
  2259.  
  2260.    end P_Index_Or_Discriminant_Constraint;
  2261.  
  2262.    -------------------------------------
  2263.    -- 3.7.1  Discriminant Association --
  2264.    -------------------------------------
  2265.  
  2266.    --  DISCRIMINANT_ASSOCIATION ::=
  2267.    --    [discriminant_SELECTOR_NAME {| discriminant_SELECTOR_NAME} =>]
  2268.    --      EXPRESSION
  2269.  
  2270.    --  This routine is used only when the name list is present and the caller
  2271.    --  has already checked this (by scanning ahead and repositioning the
  2272.    --  scan).
  2273.  
  2274.    --  Error_Recovery: cannot raise Error_Resync;
  2275.  
  2276.    function P_Discriminant_Association return Node_Id is
  2277.       Discr_Node : Node_Id;
  2278.       Names_List : List_Id;
  2279.       Ident_Sloc : Source_Ptr;
  2280.  
  2281.    begin
  2282.       Ident_Sloc := Token_Ptr;
  2283.       Names_List := New_List;
  2284.  
  2285.       loop
  2286.          Append (P_Identifier, Names_List);
  2287.          exit when Token /= Tok_Vertical_Bar;
  2288.          Scan; -- past |
  2289.       end loop;
  2290.  
  2291.       Discr_Node := New_Node (N_Discriminant_Association, Ident_Sloc);
  2292.       Set_Selector_Names (Discr_Node, Names_List);
  2293.       TF_Arrow;
  2294.       Set_Expression (Discr_Node, P_Expression);
  2295.       return Discr_Node;
  2296.    end P_Discriminant_Association;
  2297.  
  2298.    ---------------------------------
  2299.    -- 3.8  Record Type Definition --
  2300.    ---------------------------------
  2301.  
  2302.    --  RECORD_TYPE_DEFINITION ::=
  2303.    --    [[abstract] tagged] [limited] RECORD_DEFINITION
  2304.  
  2305.    --  There is no node in the tree for a record type definition. Instead
  2306.    --  a record definition node appears, with possible Abstract_Present,
  2307.    --  Tagged_Present, and Limited_Present flags set appropriately.
  2308.  
  2309.    ----------------------------
  2310.    -- 3.8  Record Definition --
  2311.    ----------------------------
  2312.  
  2313.    --  RECORD_DEFINITION ::=
  2314.    --    record
  2315.    --      COMPONENT_LIST
  2316.    --    end record
  2317.    --  | null record
  2318.  
  2319.    --  Note: in the case where a record definition node is used to represent
  2320.    --  a record type definition, the caller sets the Tagged_Present and
  2321.    --  Limited_Present flags in the resulting N_Record_Definition node as
  2322.    --  required.
  2323.  
  2324.    --  Note that the RECORD token at the start may be missing in certain
  2325.    --  error situations, so this function is expected to post the error
  2326.  
  2327.    --  Error recovery: can raise Error_Resync
  2328.  
  2329.    function P_Record_Definition return Node_Id is
  2330.       Rec_Node : Node_Id;
  2331.  
  2332.    begin
  2333.       Rec_Node := New_Node (N_Record_Definition, Token_Ptr);
  2334.  
  2335.       --  Null record case
  2336.  
  2337.       if Token = Tok_Null then
  2338.          Scan; -- past NULL
  2339.          T_Record;
  2340.          Set_Null_Present (Rec_Node, True);
  2341.  
  2342.       --  Case starting with RECORD keyword. Build scope stack entry. For the
  2343.       --  column, we use the first non-blank character on the line, to deal
  2344.       --  with situations such as:
  2345.  
  2346.       --    type X is record
  2347.       --      ...
  2348.       --    end record;
  2349.  
  2350.       --  which is not official RM indentation, but is not uncommon usage
  2351.  
  2352.       else
  2353.          Push_Scope_Stack;
  2354.          Scope.Table (Scope.Last).Etyp := E_Record;
  2355.          Scope.Table (Scope.Last).Ecol := Start_Column;
  2356.          Scope.Table (Scope.Last).Sloc := Token_Ptr;
  2357.          Scope.Table (Scope.Last).Labl := Error;
  2358.  
  2359.          T_Record;
  2360.  
  2361.          Set_Component_List (Rec_Node, P_Component_List);
  2362.  
  2363.          loop
  2364.             exit when Check_End;
  2365.             Discard_Junk_Node (P_Component_List);
  2366.          end loop;
  2367.       end if;
  2368.  
  2369.       return Rec_Node;
  2370.    end P_Record_Definition;
  2371.  
  2372.    -------------------------
  2373.    -- 3.8  Component List --
  2374.    -------------------------
  2375.  
  2376.    --  COMPONENT_LIST ::=
  2377.    --    COMPONENT_ITEM {COMPONENT_ITEM}
  2378.    --  | {COMPONENT_ITEM} VARIANT_PART
  2379.    --  | null;
  2380.  
  2381.    --  Error recovery: cannot raise Error_Resync
  2382.  
  2383.    function P_Component_List return Node_Id is
  2384.       Component_List_Node : Node_Id;
  2385.       Decls_List          : List_Id;
  2386.       Scan_State          : Saved_Scan_State;
  2387.  
  2388.    begin
  2389.       Component_List_Node := New_Node (N_Component_List, Token_Ptr);
  2390.  
  2391.       if Token = Tok_Null then
  2392.          Scan; -- past NULL
  2393.          Set_Null_Present (Component_List_Node, True);
  2394.          TF_Semicolon;
  2395.          return Component_List_Node;
  2396.  
  2397.       else
  2398.          Decls_List := New_List;
  2399.          P_Pragmas_Opt (Decls_List);
  2400.  
  2401.          if Token /= Tok_Case then
  2402.             Component_Scan_Loop : loop
  2403.                P_Component_Items (Decls_List);
  2404.                P_Pragmas_Opt (Decls_List);
  2405.  
  2406.                exit when Token = Tok_End
  2407.                  or else Token = Tok_Case
  2408.                  or else Token = Tok_When;
  2409.  
  2410.                --  We are done if we do not have an identifier. However, if
  2411.                --  we have a misspelled reserved identifier that is in a column
  2412.                --  to the right of the record definition, we will treat it as
  2413.                --  an identifier. It turns out to be too dangerous in practice
  2414.                --  to accept such a mis-spelled identifier which does not have
  2415.                --  this additional clue that confirms the incorrect spelling.
  2416.  
  2417.                if Token /= Tok_Identifier then
  2418.                   if Start_Column > Scope.Table (Scope.Last).Ecol
  2419.                     and then Is_Reserved_Identifier
  2420.                   then
  2421.                      Save_Scan_State (Scan_State); -- at reserved id
  2422.                      Scan; -- possible reserved id
  2423.  
  2424.                      if Token = Tok_Comma or else Token = Tok_Colon then
  2425.                         Restore_Scan_State (Scan_State);
  2426.                         Scan_Reserved_Identifier (Force_Msg => True);
  2427.  
  2428.                      --  Note reserved identifier used as field name after
  2429.                      --  all because not followed by colon or comma
  2430.  
  2431.                      else
  2432.                         Restore_Scan_State (Scan_State);
  2433.                         exit Component_Scan_Loop;
  2434.                      end if;
  2435.  
  2436.                   --  Non-identifier that definitely was not reserved id
  2437.  
  2438.                   else
  2439.                      exit Component_Scan_Loop;
  2440.                   end if;
  2441.                end if;
  2442.             end loop Component_Scan_Loop;
  2443.          end if;
  2444.  
  2445.          if Token = Tok_Case then
  2446.             Set_Variant_Part (Component_List_Node, P_Variant_Part);
  2447.          end if;
  2448.  
  2449.          Set_Component_Items (Component_List_Node, Decls_List);
  2450.          return Component_List_Node;
  2451.       end if;
  2452.  
  2453.    end P_Component_List;
  2454.  
  2455.    -------------------------
  2456.    -- 3.8  Component Item --
  2457.    -------------------------
  2458.  
  2459.    --  COMPONENT_ITEM ::= COMPONENT_DECLARATION | REPRESENTATION_CLAUSE
  2460.  
  2461.    --  COMPONENT_DECLARATION ::=
  2462.    --    DEFINING_IDENTIFIER_LIST : COMPONENT_DEFINITION
  2463.    --      [:= DEFAULT_EXPRESSION];
  2464.  
  2465.    --  COMPONENT_DEFINITION ::= [aliased] SUBTYPE_INDICATION
  2466.  
  2467.    --  Error recovery: cannot raise Error_Resync, if an error occurs,
  2468.    --  the scan is positioned past the following semicolon.
  2469.  
  2470.    --  Note: we do not yet allow representation clauses to appear as component
  2471.    --  items, do we need to add this capability sometime in the future ???
  2472.  
  2473.    procedure P_Component_Items (Decls : List_Id) is
  2474.       Decl_Node  : Node_Id;
  2475.       Scan_State : Saved_Scan_State;
  2476.       Num_Idents : Nat;
  2477.       Ident      : Nat;
  2478.  
  2479.       Idents : array (Int range 1 .. 4096) of Entity_Id;
  2480.       --  This array holds the list of defining identifiers. The upper bound
  2481.       --  of 4096 is intended to be essentially infinite, and we do not even
  2482.       --  bother to check for it being exceeded.
  2483.  
  2484.    begin
  2485.       if Token /= Tok_Identifier then
  2486.          Error_Msg_SC ("component declaration expected");
  2487.          Resync_Past_Semicolon;
  2488.          return;
  2489.       end if;
  2490.  
  2491.       Idents (1) := P_Defining_Identifier;
  2492.       Num_Idents := 1;
  2493.  
  2494.       while Comma_Present loop
  2495.          Num_Idents := Num_Idents + 1;
  2496.          Idents (Num_Idents) := P_Defining_Identifier;
  2497.       end loop;
  2498.  
  2499.       T_Colon;
  2500.  
  2501.       --  If there are multiple identifiers, we repeatedly scan the
  2502.       --  type and initialization expression information by resetting
  2503.       --  the scan pointer (so that we get completely separate trees
  2504.       --  for each occurrence).
  2505.  
  2506.       if Num_Idents > 1 then
  2507.          Save_Scan_State (Scan_State);
  2508.       end if;
  2509.  
  2510.       --  Loop through defining identifiers in list
  2511.  
  2512.       Ident := 1;
  2513.       Ident_Loop : loop
  2514.  
  2515.          --  The following block is present to catch Error_Resync
  2516.          --  which causes the parse to be reset past the semicolon
  2517.  
  2518.          begin
  2519.             Decl_Node := New_Node (N_Component_Declaration, Token_Ptr);
  2520.             Set_Defining_Identifier (Decl_Node, Idents (Ident));
  2521.  
  2522.             if Token = Tok_Constant then
  2523.                Error_Msg_SC ("constant components are not permitted");
  2524.                Scan;
  2525.             end if;
  2526.  
  2527.             if Token_Name = Name_Aliased then
  2528.                Check_95_Keyword (Tok_Aliased, Tok_Identifier);
  2529.             end if;
  2530.  
  2531.             if Token = Tok_Aliased then
  2532.                Note_Feature (Aliased_Objects, Token_Ptr);
  2533.                Scan; -- past ALIASED
  2534.                Set_Aliased_Present (Decl_Node, True);
  2535.             end if;
  2536.  
  2537.             if Token = Tok_Array then
  2538.                Error_Msg_SC ("anonymous arrays not allowed as components");
  2539.                raise Error_Resync;
  2540.             end if;
  2541.  
  2542.             Set_Subtype_Indication (Decl_Node, P_Subtype_Indication);
  2543.             Set_Expression (Decl_Node, Init_Expr_Opt);
  2544.  
  2545.             if Ident > 1 then
  2546.                Set_Prev_Ids (Decl_Node, True);
  2547.             end if;
  2548.  
  2549.             if Ident < Num_Idents then
  2550.                Set_More_Ids (Decl_Node, True);
  2551.             end if;
  2552.  
  2553.             Append (Decl_Node, Decls);
  2554.  
  2555.          exception
  2556.             when Error_Resync =>
  2557.                if Token /= Tok_End then
  2558.                   Resync_Past_Semicolon;
  2559.                end if;
  2560.          end;
  2561.  
  2562.          exit Ident_Loop when Ident = Num_Idents;
  2563.          Ident := Ident + 1;
  2564.          Restore_Scan_State (Scan_State);
  2565.  
  2566.       end loop Ident_Loop;
  2567.  
  2568.       TF_Semicolon;
  2569.  
  2570.    end P_Component_Items;
  2571.  
  2572.    --------------------------------
  2573.    -- 3.8  Component Declaration --
  2574.    --------------------------------
  2575.  
  2576.    --  Parsed by P_Component_Items (3.8)
  2577.  
  2578.    -------------------------
  2579.    -- 3.8.1  Variant Part --
  2580.    -------------------------
  2581.  
  2582.    --  VARIANT_PART ::=
  2583.    --    case discriminant_DIRECT_NAME is
  2584.    --      VARIANT
  2585.    --      {VARIANT}
  2586.    --    end case;
  2587.  
  2588.    --  The caller has checked that the initial token is CASE
  2589.  
  2590.    --  Error recovery: cannot raise Error_Resync
  2591.  
  2592.    function P_Variant_Part return Node_Id is
  2593.       Variant_Part_Node : Node_Id;
  2594.       Variants_List     : List_Id;
  2595.       Case_Node         : Node_Id;
  2596.       Case_Sloc         : Source_Ptr;
  2597.  
  2598.    begin
  2599.       Variant_Part_Node := New_Node (N_Variant_Part, Token_Ptr);
  2600.       Push_Scope_Stack;
  2601.       Scope.Table (Scope.Last).Etyp := E_Case;
  2602.       Scope.Table (Scope.Last).Sloc := Token_Ptr;
  2603.       Scope.Table (Scope.Last).Ecol := Start_Column;
  2604.  
  2605.       Scan; -- past CASE
  2606.       Case_Node := P_Expression;
  2607.       Case_Sloc := Token_Ptr;
  2608.       Set_Name (Variant_Part_Node, Case_Node);
  2609.  
  2610.       if Nkind (Case_Node) /= N_Identifier then
  2611.          Set_Name (Variant_Part_Node, Error);
  2612.          Error_Msg ("discriminant name expected", Sloc (Case_Node));
  2613.       end if;
  2614.  
  2615.       TF_Is;
  2616.       Variants_List := New_List;
  2617.       P_Pragmas_Opt (Variants_List);
  2618.  
  2619.       --  Test missing variant
  2620.  
  2621.       if Token = Tok_End then
  2622.          Error_Msg_BC ("WHEN expected (must have at least one variant)");
  2623.       else
  2624.          Append (P_Variant, Variants_List);
  2625.       end if;
  2626.  
  2627.       --  Loop through variants, note that we allow if in place of when,
  2628.       --  this error will be detected and handled in P_Variant.
  2629.  
  2630.       loop
  2631.          P_Pragmas_Opt (Variants_List);
  2632.  
  2633.          if Token /= Tok_When
  2634.            and then Token /= Tok_If
  2635.            and then Token /= Tok_Others
  2636.          then
  2637.             exit when Check_End;
  2638.          end if;
  2639.  
  2640.          Append (P_Variant, Variants_List);
  2641.       end loop;
  2642.  
  2643.       Set_Variants (Variant_Part_Node, Variants_List);
  2644.       return Variant_Part_Node;
  2645.  
  2646.    end P_Variant_Part;
  2647.  
  2648.    --------------------
  2649.    -- 3.8.1  Variant --
  2650.    --------------------
  2651.  
  2652.    --  VARIANT ::=
  2653.    --    when DISCRETE_CHOICE_LIST =>
  2654.    --      COMPONENT_LIST
  2655.  
  2656.    --  Error recovery: cannot raise Error_Resync
  2657.  
  2658.    --  The initial token on entry is either WHEN, IF or OTHERS
  2659.  
  2660.    function P_Variant return Node_Id is
  2661.       Variant_Node : Node_Id;
  2662.  
  2663.    begin
  2664.       --  Special check to recover nicely from use of IF in place of WHEN
  2665.  
  2666.       if Token = Tok_If then
  2667.          T_When;
  2668.          Scan; -- past IF
  2669.       else
  2670.          T_When;
  2671.       end if;
  2672.  
  2673.       Variant_Node := New_Node (N_Variant, Prev_Token_Ptr);
  2674.       Set_Discrete_Choices (Variant_Node, P_Discrete_Choice_List);
  2675.       TF_Arrow;
  2676.       Set_Component_List (Variant_Node, P_Component_List);
  2677.       return Variant_Node;
  2678.    end P_Variant;
  2679.  
  2680.    ---------------------------------
  2681.    -- 3.8.1  Discrete Choice List --
  2682.    ---------------------------------
  2683.  
  2684.    --  DISCRETE_CHOICE_LIST ::= DISCRETE_CHOICE {| DISCRETE_CHOICE}
  2685.  
  2686.    --  DISCRETE_CHOICE ::= EXPRESSION | DISCRETE_RANGE | others
  2687.  
  2688.    --  Note: in Ada 83, the expression must be a simple expression
  2689.  
  2690.    --  Error recovery: cannot raise Error_Resync
  2691.  
  2692.    function P_Discrete_Choice_List return List_Id is
  2693.       Choices     : List_Id;
  2694.       Expr_Node   : Node_Id;
  2695.       Choice_Node : Node_Id;
  2696.       Range_Node  : Node_Id;
  2697.  
  2698.    begin
  2699.       Choices := New_List;
  2700.  
  2701.       loop
  2702.          if Token = Tok_Others then
  2703.             Append (New_Node (N_Others_Choice, Token_Ptr), Choices);
  2704.             Scan; -- past OTHERS
  2705.  
  2706.          else
  2707.             begin
  2708.                Expr_Node := P_Expression_No_Right_Paren;
  2709.  
  2710.                if Token = Tok_Dot_Dot then
  2711.                   Choice_Node := New_Node (N_Range, Token_Ptr);
  2712.                   Check_Simple_Expression (Expr_Node);
  2713.                   Set_Low_Bound (Choice_Node, Expr_Node);
  2714.                   Scan; -- past ..
  2715.                   Expr_Node := P_Expression_No_Right_Paren;
  2716.                   Check_Simple_Expression (Expr_Node);
  2717.                   Set_High_Bound (Choice_Node, Expr_Node);
  2718.                   Append (Choice_Node, Choices);
  2719.  
  2720.                elsif Token = Tok_Apostrophe then
  2721.                   Append (P_Range_Attribute_Reference (Expr_Node), Choices);
  2722.  
  2723.                elsif Expr_Form = EF_Simple_Name then
  2724.                   if Token = Tok_Range then
  2725.                      Append (P_Subtype_Indication (Expr_Node), Choices);
  2726.  
  2727.                   elsif Token in Token_Class_Consk then
  2728.                      Error_Msg_SC
  2729.                         ("the only constraint allowed here " &
  2730.                          "is a range constraint");
  2731.                      Discard_Junk_Node (P_Constraint_Opt);
  2732.                      Append (Expr_Node, Choices);
  2733.  
  2734.                   else
  2735.                      Append (Expr_Node, Choices);
  2736.                   end if;
  2737.  
  2738.                else
  2739.                   Check_Simple_Expression_In_Ada_83 (Expr_Node);
  2740.                   Append (Expr_Node, Choices);
  2741.                end if;
  2742.  
  2743.             exception
  2744.                when Error_Resync =>
  2745.                   Resync_Choice;
  2746.                   return Error_List;
  2747.             end;
  2748.          end if;
  2749.  
  2750.          exit when Token /= Tok_Vertical_Bar;
  2751.          Scan; -- past |
  2752.       end loop;
  2753.  
  2754.       return Choices;
  2755.    end P_Discrete_Choice_List;
  2756.  
  2757.    ----------------------------
  2758.    -- 3.8.1  Discrete Choice --
  2759.    ----------------------------
  2760.  
  2761.    --  Parsed by P_Discrete_Choice_List (3.8.1)
  2762.  
  2763.    ----------------------------------
  2764.    -- 3.9.1  Record Extension Part --
  2765.    ----------------------------------
  2766.  
  2767.    --  RECORD_EXTENSION_PART ::= with RECORD_DEFINITION
  2768.  
  2769.    --  Parsed by P_Derived_Type_Def_Or_Private_Ext_Decl (3.4)
  2770.  
  2771.    ----------------------------------
  2772.    -- 3.10  Access Type Definition --
  2773.    ----------------------------------
  2774.  
  2775.    --  ACCESS_TYPE_DEFINITION ::=
  2776.    --    ACCESS_TO_OBJECT_DEFINITION
  2777.    --  | ACCESS_TO_SUBPROGRAM_DEFINITION
  2778.  
  2779.    --  ACCESS_TO_OBJECT_DEFINITION ::=
  2780.    --    access [GENERAL_ACCESS_MODIFIER] SUBTYPE_INDICATION
  2781.  
  2782.    --  GENERAL_ACCESS_MODIFIER ::= all | constant
  2783.  
  2784.    --  ACCESS_TO_SUBPROGRAM_DEFINITION
  2785.    --    access [protected] procedure PARAMETER_PROFILE
  2786.    --  | access [protected] function PARAMETER_AND_RESULT_PROFILE
  2787.  
  2788.    --  PARAMETER_PROFILE ::= [FORMAL_PART]
  2789.  
  2790.    --  PARAMETER_AND_RESULT_PROFILE ::= [FORMAL_PART] RETURN SUBTYPE_MARK
  2791.  
  2792.    --  The caller has checked that the initial token is ACCESS
  2793.  
  2794.    --  Error recovery: can raise Error_Resync
  2795.  
  2796.    function P_Access_Type_Definition return Node_Id is
  2797.       Prot_Flag     : Boolean;
  2798.       Access_Loc    : Source_Ptr;
  2799.       Type_Def_Node : Node_Id;
  2800.  
  2801.    begin
  2802.       Access_Loc := Token_Ptr;
  2803.       Scan; -- past ACCESS
  2804.  
  2805.       if Token_Name = Name_Protected then
  2806.          Check_95_Keyword (Tok_Protected, Tok_Procedure);
  2807.          Check_95_Keyword (Tok_Protected, Tok_Function);
  2808.       end if;
  2809.  
  2810.       Prot_Flag := (Token = Tok_Protected);
  2811.  
  2812.       if Prot_Flag then
  2813.          Scan; -- past PROTECTED
  2814.          if Token /= Tok_Procedure and then Token /= Tok_Function then
  2815.             Error_Msg_SC ("FUNCTION or PROCEDURE expected");
  2816.          end if;
  2817.       end if;
  2818.  
  2819.       if Token = Tok_Procedure then
  2820.          if Ada_83 then
  2821.             Error_Msg_SC ("(Ada 83) access to procedure not allowed!");
  2822.          end if;
  2823.  
  2824.          Note_Feature (Access_To_Subprogram_Types, Token_Ptr);
  2825.          Type_Def_Node := New_Node (N_Access_Procedure_Definition, Access_Loc);
  2826.          Scan; -- past PROCEDURE
  2827.          Set_Parameter_Specifications (Type_Def_Node, P_Parameter_Profile);
  2828.          Set_Protected_Present (Type_Def_Node, Prot_Flag);
  2829.  
  2830.       elsif Token = Tok_Function then
  2831.          if Ada_83 then
  2832.             Error_Msg_SC ("(Ada 83) access to function not allowed!");
  2833.          end if;
  2834.  
  2835.          Note_Feature (Access_To_Subprogram_Types, Token_Ptr);
  2836.          Type_Def_Node := New_Node (N_Access_Function_Definition, Access_Loc);
  2837.          Scan; -- past FUNCTION
  2838.          Set_Parameter_Specifications (Type_Def_Node, P_Parameter_Profile);
  2839.          Set_Protected_Present (Type_Def_Node, Prot_Flag);
  2840.          TF_Return;
  2841.          Set_Subtype_Mark (Type_Def_Node, P_Subtype_Mark);
  2842.          No_Constraint;
  2843.  
  2844.       else
  2845.          Type_Def_Node :=
  2846.            New_Node (N_Access_To_Object_Definition, Access_Loc);
  2847.  
  2848.          if Token = Tok_All or else Token = Tok_Constant then
  2849.             if Ada_83 then
  2850.                Error_Msg_SC ("(Ada 83) access modifier not allowed!");
  2851.             end if;
  2852.  
  2853.             if Token = Tok_All then
  2854.                Note_Feature (General_Access_Types, Token_Ptr);
  2855.                Set_All_Present (Type_Def_Node, True);
  2856.  
  2857.             else
  2858.                Note_Feature (Access_To_Constant_Types, Token_Ptr);
  2859.                Set_Constant_Present (Type_Def_Node, True);
  2860.             end if;
  2861.  
  2862.             Scan; -- past ALL or CONSTANT
  2863.          end if;
  2864.  
  2865.          Set_Subtype_Indication (Type_Def_Node, P_Subtype_Indication);
  2866.       end if;
  2867.  
  2868.       return Type_Def_Node;
  2869.    end P_Access_Type_Definition;
  2870.  
  2871.    ---------------------------------------
  2872.    -- 3.10  Access To Object Definition --
  2873.    ---------------------------------------
  2874.  
  2875.    --  Parsed by P_Access_Type_Definition (3.10)
  2876.  
  2877.    -----------------------------------
  2878.    -- 3.10  General Access Modifier --
  2879.    -----------------------------------
  2880.  
  2881.    --  Parsed by P_Access_Type_Definition (3.10)
  2882.  
  2883.    -------------------------------------------
  2884.    -- 3.10  Access To Subprogram Definition --
  2885.    -------------------------------------------
  2886.  
  2887.    --  Parsed by P_Access_Type_Definition (3.10)
  2888.  
  2889.    -----------------------------
  2890.    -- 3.10  Access Definition --
  2891.    -----------------------------
  2892.  
  2893.    --  ACCESS_DEFINITION ::= access SUBTYPE_MARK
  2894.  
  2895.    --  The caller has checked that the initial token is ACCESS
  2896.  
  2897.    --  Error recovery: cannot raise Error_Resync
  2898.  
  2899.    function P_Access_Definition return Node_Id is
  2900.       Def_Node : Node_Id;
  2901.  
  2902.    begin
  2903.       Def_Node := New_Node (N_Access_Definition, Token_Ptr);
  2904.       Scan; -- past ACCESS
  2905.       Set_Subtype_Mark (Def_Node, P_Subtype_Mark);
  2906.       No_Constraint;
  2907.       return Def_Node;
  2908.    end P_Access_Definition;
  2909.  
  2910.    -----------------------------------------
  2911.    -- 3.10.1  Incomplete Type Declaration --
  2912.    -----------------------------------------
  2913.  
  2914.    --  Parsed by P_Type_Declaration (3.2.1)
  2915.  
  2916.    ----------------------------
  2917.    -- 3.11  Declarative Part --
  2918.    ----------------------------
  2919.  
  2920.    --  DECLARATIVE_PART ::= {DECLARATIVE_ITEM}
  2921.  
  2922.    --  Error recovery: cannot raise Error_Resync (because P_Declarative_Items
  2923.    --  handles errors, and returns cleanly after an error has occurred)
  2924.  
  2925.    function P_Declarative_Part return List_Id is
  2926.       Decls : List_Id;
  2927.       Done  : Boolean;
  2928.  
  2929.    begin
  2930.       --  Indicate no bad declarations detected yet. This will be reset by
  2931.       --  P_Declarative_Items if a bad declaration is discovered.
  2932.  
  2933.       Missing_Begin_Msg := No_Error_Msg;
  2934.  
  2935.       --  Get rid of active SIS entry from outer scope. This means we will
  2936.       --  miss some nested cases, but it doesn't seem worth the effort. See
  2937.       --  discussion in Par for further details
  2938.  
  2939.       SIS_Entry_Active := False;
  2940.       Decls := New_List;
  2941.  
  2942.       --  Loop to scan out the declarations
  2943.  
  2944.       loop
  2945.          P_Declarative_Items
  2946.            (Decls, Done, Missing_Begin_Msg, In_Spec => False);
  2947.          exit when Done;
  2948.       end loop;
  2949.  
  2950.       --  Get rid of active SIS entry which is left set only if we scanned a
  2951.       --  procedure declaration and have not found the body. We could give
  2952.       --  an error message, but that really would be usurping the role of
  2953.       --  semantic analysis (this really is a missing body case).
  2954.  
  2955.       SIS_Entry_Active := False;
  2956.       return Decls;
  2957.    end P_Declarative_Part;
  2958.  
  2959.    ----------------------------
  2960.    -- 3.11  Declarative Item --
  2961.    ----------------------------
  2962.  
  2963.    --  DECLARATIVE_ITEM ::= BASIC_DECLARATIVE_ITEM | BODY
  2964.  
  2965.    --  Can return Error if a junk declaration is found, or Empty if no
  2966.    --  declaration is found (i.e. a token ending declarations, such as
  2967.    --  BEGIN or END is encountered).
  2968.  
  2969.    --  Error recovery: cannot raise Error_Resync. If an error resync occurs,
  2970.    --  then the scan is set past the next semicolon and Error is returned.
  2971.  
  2972.    procedure P_Declarative_Items
  2973.      (Decls   : List_Id;
  2974.       Done    : out Boolean;
  2975.       Msg_Id  : in out Error_Msg_Id;
  2976.       In_Spec : Boolean)
  2977.    is
  2978.       Scan_State : Saved_Scan_State;
  2979.  
  2980.    begin
  2981.       if Style_Check then Style.Check_Indentation; end if;
  2982.  
  2983.       case Token is
  2984.  
  2985.          when Tok_Function =>
  2986.             Append (P_Subprogram (Pf_Decl_Gins_Pbod_Rnam_Stub), Decls);
  2987.             Done := False;
  2988.  
  2989.          when Tok_For =>
  2990.             Append (P_Representation_Clause, Decls);
  2991.             Done := False;
  2992.  
  2993.          when Tok_Generic =>
  2994.             Append (P_Generic, Decls);
  2995.             Done := False;
  2996.  
  2997.          when Tok_Identifier =>
  2998.             P_Identifier_Declarations (Decls, Done, Msg_Id, In_Spec);
  2999.  
  3000.          when Tok_Package =>
  3001.             Append (P_Package (Pf_Decl_Gins_Pbod_Rnam_Stub), Decls);
  3002.             Done := False;
  3003.  
  3004.          when Tok_Pragma =>
  3005.             Append (P_Pragma, Decls);
  3006.             Done := False;
  3007.  
  3008.          when Tok_Procedure =>
  3009.             Append (P_Subprogram (Pf_Decl_Gins_Pbod_Rnam_Stub), Decls);
  3010.             Done := False;
  3011.  
  3012.          when Tok_Protected =>
  3013.             Scan; -- past PROTECTED
  3014.             Append (P_Protected, Decls);
  3015.             Done := False;
  3016.  
  3017.          when Tok_Subtype =>
  3018.             Append (P_Subtype_Declaration, Decls);
  3019.             Done := False;
  3020.  
  3021.          when Tok_Task =>
  3022.             Scan; -- past TASK
  3023.             Append (P_Task, Decls);
  3024.             Done := False;
  3025.  
  3026.          when Tok_Type =>
  3027.             Append (P_Type_Declaration, Decls);
  3028.             Done := False;
  3029.  
  3030.          when Tok_Use =>
  3031.             Append (P_Use_Clause, Decls);
  3032.             Done := False;
  3033.  
  3034.          --  BEGIN terminates the scan of a sequence of declarations unless
  3035.          --  there is a missing subprogram body, see section on handling
  3036.          --  semicolon in place of IS. We only treat the begin as satisfying
  3037.          --  the subprogram declaration if it falls in the expected column
  3038.          --  or to its right.
  3039.  
  3040.          when Tok_Begin =>
  3041.             if SIS_Entry_Active and then Start_Column >= SIS_Ecol then
  3042.  
  3043.                --  Here we have the case where a BEGIN is encountered during
  3044.                --  declarations in a declarative part, or at the outer level,
  3045.                --  and there is a subprogram declaration outstanding for which
  3046.                --  no body has been supplied. This is the case where we assume
  3047.                --  that the semicolon in the subprogram declaration should
  3048.                --  really have been is. The active SIS entry describes the
  3049.                --  subprogram declaration. On return the declaration has been
  3050.                --  modified to become a body.
  3051.  
  3052.                declare
  3053.                   Specification_Node : Node_Id;
  3054.                   Outer_Decls        : List_Id;
  3055.                   Decl_Node          : Node_Id;
  3056.                   Body_Node          : Node_Id;
  3057.  
  3058.                begin
  3059.                   --  First issue the error message. If we had a missing
  3060.                   --  semicolon in the declaration, then change the message
  3061.                   --  to <missing "is">
  3062.  
  3063.                   if SIS_Missing_Semicolon_Message /= No_Error_Msg then
  3064.                      Change_Error_Text     -- Replace: "missing semicolon"
  3065.                        (SIS_Missing_Semicolon_Message, "missing ""is""     ");
  3066.  
  3067.                   --  Otherwise we saved the semicolon position, so complain
  3068.  
  3069.                   else
  3070.                      Error_Msg ("semicolon should be IS", SIS_Semicolon_Sloc);
  3071.                   end if;
  3072.  
  3073.                   --  The next job is to fix up any declarations that occurred
  3074.                   --  between the procedure header and the BEGIN. These got
  3075.                   --  chained to the outer declarative region (immediately
  3076.                   --  after the procedure declaration) and they should be
  3077.                   --  chained to the subprogram itself, which is a body
  3078.                   --  rather than a spec.
  3079.  
  3080.                   Specification_Node := Specification (SIS_Declaration_Node);
  3081.                   Change_Node (SIS_Declaration_Node, N_Subprogram_Body);
  3082.                   Body_Node := SIS_Declaration_Node;
  3083.                   Set_Specification (Body_Node, Specification_Node);
  3084.                   Set_Declarations (Body_Node, New_List);
  3085.  
  3086.                   loop
  3087.                      Decl_Node := Remove_Next (Body_Node);
  3088.                      exit when Decl_Node = Empty;
  3089.                      Append (Decl_Node, Declarations (Body_Node));
  3090.                   end loop;
  3091.  
  3092.                   --  Now make the scope table entry for the Begin-End and
  3093.                   --  scan it out
  3094.  
  3095.                   Push_Scope_Stack;
  3096.                   Scope.Table (Scope.Last).Sloc := SIS_Sloc;
  3097.                   Scope.Table (Scope.Last).Etyp := E_Name;
  3098.                   Scope.Table (Scope.Last).Ecol := SIS_Ecol;
  3099.                   Scope.Table (Scope.Last).Labl := SIS_Labl;
  3100.                   Scope.Table (Scope.Last).Lreq := False;
  3101.                   SIS_Entry_Active := False;
  3102.                   Scan; -- past BEGIN
  3103.                   Set_Handled_Statement_Sequence (Body_Node,
  3104.                     P_Handled_Sequence_Of_Statements);
  3105.                   End_Statements;
  3106.                end;
  3107.  
  3108.                Done := False;
  3109.  
  3110.             else
  3111.                Done := True;
  3112.             end if;
  3113.  
  3114.             --  Normally an END terminates the scan for basic declarative
  3115.             --  items. The one exception is END RECORD, which is probably
  3116.             --  left over from some other junk.
  3117.  
  3118.             when Tok_End =>
  3119.                Save_Scan_State (Scan_State); -- at END
  3120.                Scan; -- past END
  3121.  
  3122.                if Token = Tok_Record then
  3123.                   Error_Msg_SP ("no RECORD for this `end record`!");
  3124.                   Scan; -- past RECORD
  3125.                   TF_Semicolon;
  3126.  
  3127.                else
  3128.                   Restore_Scan_State (Scan_State); -- to END
  3129.                   Done := True;
  3130.                end if;
  3131.  
  3132.          --  The following tokens which can only be the start of a statement
  3133.          --  are considered to end a declarative part (i.e. we have a missing
  3134.          --  BEGIN situation). We are fairly conservative in making this
  3135.          --  judgment, because it is a real mess to go into statement mode
  3136.          --  prematurely in reponse to a junk declaration.
  3137.  
  3138.          when Tok_Abort     |
  3139.               Tok_Accept    |
  3140.               Tok_Declare   |
  3141.               Tok_Delay     |
  3142.               Tok_Exit      |
  3143.               Tok_Goto      |
  3144.               Tok_If        |
  3145.               Tok_Loop      |
  3146.               Tok_Null      |
  3147.               Tok_Requeue   |
  3148.               Tok_Select    |
  3149.               Tok_While     =>
  3150.  
  3151.             --  But before we decide that it's a statement, let's check for
  3152.             --  a reserved word misused as an identifier.
  3153.  
  3154.             if Is_Reserved_Identifier then
  3155.                Save_Scan_State (Scan_State);
  3156.                Scan; -- past the token
  3157.  
  3158.                --  If reserved identifier not followed by colon or comma, then
  3159.                --  this is most likely an assignment statement to the bad id.
  3160.  
  3161.                if Token /= Tok_Colon and then Token /= Tok_Comma then
  3162.                   Restore_Scan_State (Scan_State);
  3163.                   Statement_When_Declaration_Expected
  3164.                     (Decls, Done, Msg_Id, In_Spec);
  3165.  
  3166.                --  Otherwise we have a declaration of the bad id
  3167.  
  3168.                else
  3169.                   Restore_Scan_State (Scan_State);
  3170.                   Scan_Reserved_Identifier (Force_Msg => True);
  3171.                   P_Identifier_Declarations (Decls, Done, Msg_Id, In_Spec);
  3172.                end if;
  3173.  
  3174.             --  If not reserved identifier, then it's definitely a statement
  3175.  
  3176.             else
  3177.                Statement_When_Declaration_Expected
  3178.                  (Decls, Done, Msg_Id, In_Spec);
  3179.                return;
  3180.             end if;
  3181.  
  3182.          --  The token RETURN may well also signal a missing BEGIN situation,
  3183.          --  however, we never let it end the declarative part, because it may
  3184.          --  also be part of a half-baked function declaration.
  3185.  
  3186.          when Tok_Return =>
  3187.             Error_Msg_SC ("misplaced RETURN statement");
  3188.             Scan; -- past RETURN
  3189.             raise Error_Resync;
  3190.  
  3191.          --  PRIVATE definitely terminates the declarations, and we don't
  3192.          --  check for a misuse of a reserved keyword in this case.
  3193.  
  3194.          when Tok_Private =>
  3195.             Done := True;
  3196.  
  3197.          --  An end of file definitely terminates the declarations!
  3198.  
  3199.          when Tok_EOF =>
  3200.             Done := True;
  3201.  
  3202.          --  The remaining tokens do not end the scan, but cannot start a
  3203.          --  valid declaration, so we signal an error and resynchronize.
  3204.          --  But first check for misuse of a reserved identifier.
  3205.  
  3206.          when others =>
  3207.  
  3208.             --  Here to we check for a reserved identifier
  3209.  
  3210.             if Is_Reserved_Identifier then
  3211.                Save_Scan_State (Scan_State);
  3212.                Scan; -- past the token
  3213.  
  3214.                if Token /= Tok_Colon and then Token /= Tok_Comma then
  3215.                   Restore_Scan_State (Scan_State);
  3216.                   Error_Msg_SC ("declaration expected");
  3217.                   Resync_Past_Semicolon;
  3218.                   Done := True;
  3219.                else
  3220.                   Restore_Scan_State (Scan_State);
  3221.                   Scan_Reserved_Identifier (Force_Msg => True);
  3222.                   P_Identifier_Declarations (Decls, Done, Msg_Id, In_Spec);
  3223.                end if;
  3224.  
  3225.             else
  3226.                Error_Msg_SC ("declaration expected");
  3227.                Resync_Past_Semicolon;
  3228.                Done := True;
  3229.             end if;
  3230.  
  3231.       end case;
  3232.  
  3233.    --  To resynchronize after an error, we scan to the next semicolon and
  3234.    --  return with Done = False, indicating that there may still be more
  3235.    --  valid declarations to come.
  3236.  
  3237.    exception
  3238.       when Error_Resync =>
  3239.          Resync_Past_Semicolon;
  3240.          Done := False;
  3241.  
  3242.    end P_Declarative_Items;
  3243.  
  3244.    ----------------------------------
  3245.    -- 3.11  Basic Declarative Item --
  3246.    ----------------------------------
  3247.  
  3248.    --  BASIC_DECLARATIVE_ITEM ::=
  3249.    --    BASIC_DECLARATION | REPRESENTATION_CLAUSE | USE_CLAUSE
  3250.  
  3251.    --  Scan zero or more basic declarative items
  3252.  
  3253.    --  Error recovery: cannot raise Error_Resync. If an error is detected, then
  3254.    --  the scan pointer is repositioned past the next semicolon, and the scan
  3255.    --  for declarative items continues.
  3256.  
  3257.    function P_Basic_Declarative_Items return List_Id is
  3258.       Decl  : Node_Id;
  3259.       Decls : List_Id;
  3260.       Kind  : Node_Kind;
  3261.       Done  : Boolean;
  3262.       Msg   : Error_Msg_Id := No_Error_Msg;
  3263.  
  3264.    begin
  3265.       --  Get rid of active SIS entry from outer scope. This means we will
  3266.       --  miss some nested cases, but it doesn't seem worth the effort. See
  3267.       --  discussion in Par for further details
  3268.  
  3269.       SIS_Entry_Active := False;
  3270.  
  3271.       --  Loop to scan out declarations
  3272.  
  3273.       Decls := New_List;
  3274.  
  3275.       loop
  3276.          P_Declarative_Items (Decls, Done, Msg, In_Spec => True);
  3277.          exit when Done;
  3278.       end loop;
  3279.  
  3280.       --  Get rid of active SIS entry. This is set only if we have scanned a
  3281.       --  procedure declaration and have not found the body. We could give
  3282.       --  an error message, but that really would be usurping the role of
  3283.       --  semantic analysis (this really is a case of a missing body).
  3284.  
  3285.       SIS_Entry_Active := False;
  3286.  
  3287.       --  Test for body scanned, not acceptable as basic declarative item
  3288.  
  3289.       Decl := First (Decls);
  3290.  
  3291.       while Present (Decl) loop
  3292.          Kind := Nkind (Decl);
  3293.  
  3294.          --  Test for body scanned, not acceptable as basic decl item
  3295.  
  3296.          if Kind = N_Subprogram_Body or else
  3297.             Kind = N_Package_Body or else
  3298.             Kind = N_Task_Body or else
  3299.             Kind = N_Protected_Body
  3300.          then
  3301.             Error_Msg
  3302.               ("proper body not allowed in package spec", Sloc (Decl));
  3303.  
  3304.          --  Test for body stub scanned, not acceptable as basic decl item
  3305.  
  3306.          elsif Kind in N_Body_Stub then
  3307.             Error_Msg
  3308.               ("body stub not allowed in package spec", Sloc (Decl));
  3309.  
  3310.          end if;
  3311.  
  3312.          Decl := Next (Decl);
  3313.       end loop;
  3314.  
  3315.       return Decls;
  3316.    end P_Basic_Declarative_Items;
  3317.  
  3318.    ----------------
  3319.    -- 3.11  Body --
  3320.    ----------------
  3321.  
  3322.    --  For proper body, see below
  3323.    --  For body stub, see 10.1.3
  3324.  
  3325.    -----------------------
  3326.    -- 3.11  Proper Body --
  3327.    -----------------------
  3328.  
  3329.    --  Subprogram body is parsed by P_Subprogram (6.1)
  3330.    --  Package body is parsed by P_Package (7.1)
  3331.    --  Task body is parsed by P_Task (9.1)
  3332.    --  Protected body is parsed by P_Protected (9.4)
  3333.  
  3334.    -----------------------------------------
  3335.    -- Statement_When_Declaration_Expected --
  3336.    -----------------------------------------
  3337.  
  3338.    procedure Statement_When_Declaration_Expected
  3339.      (Decls   : List_Id;
  3340.       Done    : out Boolean;
  3341.       Msg_Id  : in out Error_Msg_Id;
  3342.       In_Spec : Boolean)
  3343.    is
  3344.    begin
  3345.       --  Case of second occurrence of statement in one declaration sequence
  3346.  
  3347.       if Msg_Id /= No_Error_Msg then
  3348.  
  3349.          --  In the procedure spec case, just ignore it, we only give one
  3350.          --  message for the first occurrence, since otherwise we may get
  3351.          --  horrible cascading if BODY was missing in the header line.
  3352.  
  3353.          if In_Spec then
  3354.             null;
  3355.  
  3356.          --  In the declarative part case, take a second statement as a sure
  3357.          --  sign that we really have a missing BEGIN, and end the declarative
  3358.          --  part now. Note that the caller will fix up the first message to
  3359.          --  say "missing BEGIN" so that's how the error will be signalled.
  3360.  
  3361.          else
  3362.             Done := True;
  3363.             return;
  3364.          end if;
  3365.  
  3366.       --  Case of first occurrence of unexpected statement
  3367.  
  3368.       else
  3369.          --  If we are in a package spec, then give message of statement
  3370.          --  not allowed in package spec. This message never gets changed.
  3371.  
  3372.          if In_Spec then
  3373.             Error_Msg_SC ("statement not allowed in package spec");
  3374.  
  3375.          --  If in declarative part, then we give the message complaining
  3376.          --  about finding a statement when a declaration is expected. This
  3377.          --  gets changed to a complaint about a missing BEGIN if we later
  3378.          --  find that no BEGIN is present.
  3379.  
  3380.          else
  3381.             Error_Msg_SC ("statement not allowed in declarative part");
  3382.          end if;
  3383.  
  3384.          --  Capture message Id. This is used for two purposes, first to
  3385.          --  stop multiple messages, see test above, and second, to allow
  3386.          --  the replacement of the message in the declarative part case.
  3387.  
  3388.          Msg_Id := Get_Msg_Id;
  3389.       end if;
  3390.  
  3391.       --  In all cases except the case in which we decided to terminate the
  3392.       --  declaration sequence on a second error, we scan out the statement
  3393.       --  and append it to the list of declarations (note that the semantics
  3394.       --  can handle statements in a declaration list so if we proceed to
  3395.       --  call the semantic phase, all will be (reasonably) well!
  3396.  
  3397.       Append_List_To (Decls, P_Sequence_Of_Statements (SS_Unco));
  3398.  
  3399.       --  Done is set to False, since we want to continue the scan of
  3400.       --  declarations, hoping that this statement was a temporary glitch.
  3401.       --  If we indeed are now in the statement part (i.e. this was a missing
  3402.       --  BEGIN, then it's not terrible, we will simply keep calling this
  3403.       --  procedure to process the statements one by one, and then finally
  3404.       --  hit the missing BEGIN, which will clean up the error message.
  3405.  
  3406.       Done := False;
  3407.  
  3408.    end Statement_When_Declaration_Expected;
  3409.  
  3410. end Ch3;
  3411.