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-ch9.adb < prev    next >
Text File  |  1996-09-28  |  48KB  |  1,507 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                              P A R . C H 9                               --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.60 $                             --
  10. --                                                                          --
  11. --           Copyright (c) 1992,1993,1994 NYU, All Rights Reserved          --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. separate (Par)
  26. package body Ch9 is
  27.  
  28.    --  Local subprograms, used only in this chapter
  29.  
  30.    function P_Accept_Alternative                   return Node_Id;
  31.    function P_Delay_Alternative                    return Node_Id;
  32.    function P_Delay_Relative_Statement             return Node_Id;
  33.    function P_Delay_Until_Statement                return Node_Id;
  34.    function P_Entry_Barrier                        return Node_Id;
  35.    function P_Entry_Body_Formal_Part               return Node_Id;
  36.    function P_Entry_Declaration                    return Node_Id;
  37.    function P_Entry_Index_Specification            return Node_Id;
  38.    function P_Protected_Definition                 return Node_Id;
  39.    function P_Protected_Operation_Declaration_Opt  return Node_Id;
  40.    function P_Protected_Operation_Items            return List_Id;
  41.    function P_Task_Definition                      return Node_Id;
  42.    function P_Task_Items                           return List_Id;
  43.  
  44.    -----------------------------
  45.    -- 9.1  Task (also 10.1.3) --
  46.    -----------------------------
  47.  
  48.    --  TASK_TYPE_DECLARATION ::=
  49.    --    task type DEFINING_IDENTIFIER [KNOWN_DISCRIMINANT_PART]
  50.    --      [is TASK_DEFINITION];
  51.  
  52.    --  SINGLE_TASK_DECLARATION ::=
  53.    --    task DEFINING_IDENTIFIER [is TASK_DEFINITION];
  54.  
  55.    --  TASK_BODY ::=
  56.    --    task body DEFINING_IDENTIFIER is
  57.    --      DECLARATIVE_PART
  58.    --    begin
  59.    --      HANDLED_SEQUENCE_OF_STATEMENTS
  60.    --    end [task_IDENTIFIER]
  61.  
  62.    --  TASK_BODY_STUB ::=
  63.    --    task body DEFINING_IDENTIFIER is separate;
  64.  
  65.    --  This routine scans out a task declaration, task body, or task stub
  66.  
  67.    --  The caller has checked that the initial token is TASK and scanned
  68.    --  past it, so that Token is set to the token after TASK
  69.  
  70.    --  Error recovery: cannot raise Error_Resync
  71.  
  72.    function P_Task return Node_Id is
  73.       Name_Node  : Node_Id;
  74.       Task_Node  : Node_Id;
  75.       Task_Sloc  : Source_Ptr;
  76.  
  77.    begin
  78.       Push_Scope_Stack;
  79.       Scope.Table (Scope.Last).Etyp := E_Name;
  80.       Scope.Table (Scope.Last).Ecol := Start_Column;
  81.       Scope.Table (Scope.Last).Sloc := Token_Ptr;
  82.       Scope.Table (Scope.Last).Lreq := False;
  83.       Task_Sloc := Prev_Token_Ptr;
  84.  
  85.       if Token = Tok_Body then
  86.          Scan; -- past BODY
  87.          Name_Node := P_Defining_Identifier;
  88.          Scope.Table (Scope.Last).Labl := Name_Node;
  89.  
  90.          if Token = Tok_Left_Paren then
  91.             Error_Msg_SC ("discriminant part not allowed in task body");
  92.             Discard_Junk_List (P_Known_Discriminant_Part_Opt);
  93.          end if;
  94.  
  95.          TF_Is;
  96.  
  97.          --  Task stub
  98.  
  99.          if Token = Tok_Separate then
  100.             Scan; -- past SEPARATE
  101.             Task_Node := New_Node (N_Task_Body_Stub, Task_Sloc);
  102.             Set_Defining_Identifier (Task_Node, Name_Node);
  103.             TF_Semicolon;
  104.             Pop_Scope_Stack; -- remove unused entry
  105.  
  106.          --  Task body
  107.  
  108.          else
  109.             Task_Node := New_Node (N_Task_Body, Task_Sloc);
  110.             Set_Defining_Identifier (Task_Node, Name_Node);
  111.             Parse_Decls_Begin_End (Task_Node);
  112.          end if;
  113.  
  114.          return Task_Node;
  115.  
  116.       --  Otherwise we must have a task declaration
  117.  
  118.       else
  119.          if Token = Tok_Type then
  120.             Scan; -- past TYPE
  121.             Task_Node := New_Node (N_Task_Type_Declaration, Task_Sloc);
  122.             Name_Node := P_Defining_Identifier;
  123.             Set_Defining_Identifier (Task_Node, Name_Node);
  124.             Scope.Table (Scope.Last).Labl := Name_Node;
  125.             Set_Discriminant_Specifications
  126.               (Task_Node, P_Known_Discriminant_Part_Opt);
  127.  
  128.          else
  129.             Task_Node := New_Node (N_Single_Task_Declaration, Task_Sloc);
  130.             Name_Node := P_Defining_Identifier;
  131.             Set_Defining_Identifier (Task_Node, Name_Node);
  132.             Scope.Table (Scope.Last).Labl := Name_Node;
  133.  
  134.             if Token = Tok_Left_Paren then
  135.                Error_Msg_SC ("discriminant part not allowed for single task");
  136.                Discard_Junk_List (P_Known_Discriminant_Part_Opt);
  137.             end if;
  138.  
  139.          end if;
  140.  
  141.          --  Parse optional task definition. Note that P_Task_Definition scans
  142.          --  out the semicolon as well as the task definition itself.
  143.  
  144.          if Token = Tok_Semicolon then
  145.             Pop_Scope_Stack; -- Remove unused entry
  146.             Scan; -- past semicolon
  147.          else
  148.             TF_Is; -- must have IS if no semicolon
  149.             Set_Task_Definition (Task_Node, P_Task_Definition);
  150.          end if;
  151.  
  152.          return Task_Node;
  153.       end if;
  154.    end P_Task;
  155.  
  156.    --------------------------------
  157.    -- 9.1  Task Type Declaration --
  158.    --------------------------------
  159.  
  160.    --  Parsed by P_Task (9.1)
  161.  
  162.    ----------------------------------
  163.    -- 9.1  Single Task Declaration --
  164.    ----------------------------------
  165.  
  166.    --  Parsed by P_Task (9.1)
  167.  
  168.    --------------------------
  169.    -- 9.1  Task Definition --
  170.    --------------------------
  171.  
  172.    --  TASK_DEFINITION ::=
  173.    --      {TASK_ITEM}
  174.    --    [private
  175.    --      {TASK_ITEM}]
  176.    --    end [task_IDENTIFIER];
  177.  
  178.    --  The caller has already made the scope stack entry
  179.  
  180.    --  Note: there is a small deviation from official syntax here in that we
  181.    --  regard the semicolon after end as part of the Task_Definition, and in
  182.    --  the official syntax, it's part of the enclosing declaration. The reason
  183.    --  for this deviation is that otherwise the end processing would have to
  184.    --  be special cased, which would be a nuisance!
  185.  
  186.    --  Error recovery:  cannot raise Error_Resync
  187.  
  188.    function P_Task_Definition return Node_Id is
  189.       Def_Node  : Node_Id;
  190.  
  191.    begin
  192.       Def_Node := New_Node (N_Task_Definition, Token_Ptr);
  193.       Set_Visible_Declarations (Def_Node, P_Task_Items);
  194.  
  195.       if Token = Tok_Private then
  196.          Scan; -- past PRIVATE
  197.          Set_Private_Declarations (Def_Node, P_Task_Items);
  198.  
  199.          --  Deal gracefully with multiple PRIVATE parts
  200.  
  201.          while Token = Tok_Private loop
  202.             Error_Msg_SC ("Only one private part allowed per task");
  203.             Scan; -- past PRIVATE
  204.             Append_List (P_Task_Items, Private_Declarations (Def_Node));
  205.          end loop;
  206.       end if;
  207.  
  208.       End_Statements;
  209.       return Def_Node;
  210.    end P_Task_Definition;
  211.  
  212.    --------------------
  213.    -- 9.1  Task Item --
  214.    --------------------
  215.  
  216.    --  TASK_ITEM ::= ENTRY_DECLARATION | REPRESENTATION_CLAUSE
  217.  
  218.    --  This subprogram scans a (possibly empty) list of task items and pragmas
  219.  
  220.    --  Error recovery:  cannot raise Error_Resync
  221.  
  222.    --  Note: a pragma can also be returned in this position
  223.  
  224.    function P_Task_Items return List_Id is
  225.       Items      : List_Id;
  226.       Item_Node  : Node_Id;
  227.       Decl_Sloc  : Source_Ptr;
  228.  
  229.    begin
  230.       --  Get rid of active SIS entry from outer scope. This means we will
  231.       --  miss some nested cases, but it doesn't seem worth the effort. See
  232.       --  discussion in Par for further details
  233.  
  234.       SIS_Entry_Active := False;
  235.  
  236.       --  Loop to scan out task items
  237.  
  238.       Items := New_List;
  239.  
  240.       Decl_Loop : loop
  241.          Decl_Sloc := Token_Ptr;
  242.  
  243.          if Token = Tok_Pragma then
  244.             Append (P_Pragma, Items);
  245.  
  246.          elsif Token = Tok_Entry then
  247.             Append (P_Entry_Declaration, Items);
  248.  
  249.          elsif Token = Tok_For then
  250.             --  Representation clause in task declaration. The only rep
  251.             --  clause which is legal in a protected is an address clause,
  252.             --  so that is what we try to scan out.
  253.  
  254.             Item_Node := P_Representation_Clause;
  255.  
  256.             if Nkind (Item_Node) = N_At_Clause then
  257.                Append (Item_Node, Items);
  258.             else
  259.                Error_Msg
  260.                  ("the only representation clause " &
  261.                   "allowed here is an address clause!", Decl_Sloc);
  262.             end if;
  263.  
  264.          elsif Token = Tok_Identifier
  265.            or else Token in Token_Class_Declk
  266.          then
  267.             Error_Msg_SC ("Illegal declaration in task definition");
  268.             Resync_Past_Semicolon;
  269.  
  270.          else
  271.             exit Decl_Loop;
  272.          end if;
  273.       end loop Decl_Loop;
  274.  
  275.       return Items;
  276.    end P_Task_Items;
  277.  
  278.    --------------------
  279.    -- 9.1  Task Body --
  280.    --------------------
  281.  
  282.    --  Parsed by P_Task (9.1)
  283.  
  284.    ----------------------------------
  285.    -- 9.4  Protected (also 10.1.3) --
  286.    ----------------------------------
  287.  
  288.    --  PROTECTED_TYPE_DECLARATION ::=
  289.    --    protected type DEFINING_IDENTIFIER [KNOWN_DISCRIMINANT_PART]
  290.    --      is PROTECTED_DEFINITION;
  291.  
  292.    --  SINGLE_PROTECTED_DECLARATION ::=
  293.    --    protected DEFINING_IDENTIFIER is PROTECTED_DEFINITION;
  294.  
  295.    --  PROTECTED_BODY ::=
  296.    --    protected body DEFINING_IDENTIFIER is
  297.    --      {PROTECTED_OPERATION_ITEM}
  298.    --    end [protected_IDENTIFIER];
  299.  
  300.    --  PROTECTED_BODY_STUB ::=
  301.    --    protected body DEFINING_IDENTIFIER is separate;
  302.  
  303.    --  This routine scans out a protected declaration, protected body
  304.    --  or a protected stub.
  305.  
  306.    --  The caller has checked that the initial token is PROTECTED and
  307.    --  scanned past it, so Token is set to the following token.
  308.  
  309.    --  Error recovery: cannot raise Error_Resync
  310.  
  311.    function P_Protected return Node_Id is
  312.       Name_Node      : Node_Id;
  313.       Protected_Node : Node_Id;
  314.       Protected_Sloc : Source_Ptr;
  315.  
  316.    begin
  317.       Note_Feature (Protected_Units_And_Operations, Prev_Token_Ptr);
  318.       Push_Scope_Stack;
  319.       Scope.Table (Scope.Last).Etyp := E_Name;
  320.       Scope.Table (Scope.Last).Ecol := Start_Column;
  321.       Scope.Table (Scope.Last).Lreq := False;
  322.       Protected_Sloc := Prev_Token_Ptr;
  323.  
  324.       if Token = Tok_Body then
  325.          Scan; -- past BODY
  326.          Name_Node := P_Defining_Identifier;
  327.          Scope.Table (Scope.Last).Labl := Name_Node;
  328.  
  329.          if Token = Tok_Left_Paren then
  330.             Error_Msg_SC ("discriminant part not allowed in protected body");
  331.             Discard_Junk_List (P_Known_Discriminant_Part_Opt);
  332.          end if;
  333.  
  334.          TF_Is;
  335.  
  336.          --  Protected stub
  337.  
  338.          if Token = Tok_Separate then
  339.             Scan; -- past SEPARATE
  340.             Protected_Node := New_Node (N_Protected_Body_Stub, Protected_Sloc);
  341.             Set_Defining_Identifier (Protected_Node, Name_Node);
  342.             TF_Semicolon;
  343.             Pop_Scope_Stack; -- remove unused entry
  344.  
  345.          --  Protected body
  346.  
  347.          else
  348.             Protected_Node := New_Node (N_Protected_Body, Protected_Sloc);
  349.             Set_Defining_Identifier (Protected_Node, Name_Node);
  350.             Set_Declarations (Protected_Node, P_Protected_Operation_Items);
  351.             End_Statements;
  352.          end if;
  353.  
  354.          return Protected_Node;
  355.  
  356.       --  Otherwise we must have a protected declaration
  357.  
  358.       else
  359.          if Token = Tok_Type then
  360.             Scan; -- past TYPE
  361.             Protected_Node :=
  362.               New_Node (N_Protected_Type_Declaration, Protected_Sloc);
  363.             Name_Node := P_Defining_Identifier;
  364.             Set_Defining_Identifier (Protected_Node, Name_Node);
  365.             Scope.Table (Scope.Last).Labl := Name_Node;
  366.             Set_Discriminant_Specifications
  367.               (Protected_Node, P_Known_Discriminant_Part_Opt);
  368.  
  369.          else
  370.             Protected_Node :=
  371.               New_Node (N_Single_Protected_Declaration, Protected_Sloc);
  372.             Name_Node := P_Defining_Identifier;
  373.             Set_Defining_Identifier (Protected_Node, Name_Node);
  374.  
  375.             if Token = Tok_Left_Paren then
  376.                Error_Msg_SC
  377.                  ("discriminant part not allowed for single protected");
  378.                Discard_Junk_List (P_Known_Discriminant_Part_Opt);
  379.             end if;
  380.  
  381.             Scope.Table (Scope.Last).Labl := Name_Node;
  382.          end if;
  383.  
  384.          T_Is;
  385.          Set_Protected_Definition (Protected_Node, P_Protected_Definition);
  386.          return Protected_Node;
  387.       end if;
  388.    end P_Protected;
  389.  
  390.    -------------------------------------
  391.    -- 9.4  Protected Type Declaration --
  392.    -------------------------------------
  393.  
  394.    --  Parsed by P_Protected (9.4)
  395.  
  396.    ---------------------------------------
  397.    -- 9.4  Single Protected Declaration --
  398.    ---------------------------------------
  399.  
  400.    --  Parsed by P_Protected (9.4)
  401.  
  402.    -------------------------------
  403.    -- 9.4  Protected Definition --
  404.    -------------------------------
  405.  
  406.    --  PROTECTED_DEFINITION ::=
  407.    --      {PROTECTED_OPERATION_DECLARATION}
  408.    --    [private
  409.    --      {PROTECTED_ELEMENT_DECLARATION}]
  410.    --    end [protected_IDENTIFIER]
  411.  
  412.    --  PROTECTED_ELEMENT_DECLARATION ::=
  413.    --    PROTECTED_OPERATION_DECLARATION
  414.    --  | COMPONENT_DECLARATION
  415.  
  416.    --  The caller has already established the scope stack entry
  417.  
  418.    --  Error recovery: cannot raise Error_Resync
  419.  
  420.    function P_Protected_Definition return Node_Id is
  421.       Def_Node  : Node_Id;
  422.       Item_Node : Node_Id;
  423.  
  424.    begin
  425.       Def_Node := New_Node (N_Protected_Definition, Token_Ptr);
  426.  
  427.       --  Get rid of active SIS entry from outer scope. This means we will
  428.       --  miss some nested cases, but it doesn't seem worth the effort. See
  429.       --  discussion in Par for further details
  430.  
  431.       SIS_Entry_Active := False;
  432.  
  433.       --  Loop to scan visible declarations (protected operation declarations)
  434.  
  435.       Set_Visible_Declarations (Def_Node, New_List);
  436.  
  437.       loop
  438.          Item_Node := P_Protected_Operation_Declaration_Opt;
  439.          exit when No (Item_Node);
  440.          Append (Item_Node, Visible_Declarations (Def_Node));
  441.       end loop;
  442.  
  443.       --  Deal with PRIVATE part (including graceful handling
  444.       --  of multiple PRIVATE parts).
  445.  
  446.       Private_Loop : while Token = Tok_Private loop
  447.          if No (Private_Declarations (Def_Node)) then
  448.             Set_Private_Declarations (Def_Node, New_List);
  449.          else
  450.             Error_Msg_SC ("duplicate private part");
  451.          end if;
  452.  
  453.          Scan; -- past PRIVATE
  454.  
  455.          Declaration_Loop : loop
  456.             if Token = Tok_Identifier then
  457.                P_Component_Items (Private_Declarations (Def_Node));
  458.             else
  459.                Item_Node := P_Protected_Operation_Declaration_Opt;
  460.                exit Declaration_Loop when No (Item_Node);
  461.                Append (Item_Node, Private_Declarations (Def_Node));
  462.             end if;
  463.          end loop Declaration_Loop;
  464.       end loop Private_Loop;
  465.  
  466.       End_Statements;
  467.       return Def_Node;
  468.    end P_Protected_Definition;
  469.  
  470.    ------------------------------------------
  471.    -- 9.4  Protected Operation Declaration --
  472.    ------------------------------------------
  473.  
  474.    --  PROTECTED_OPERATION_DECLARATION ::=
  475.    --    SUBPROGRAM_DECLARATION
  476.    --  | ENTRY_DECLARATION
  477.    --  | REPRESENTATION_CLAUSE
  478.  
  479.    --  Error recovery: cannot raise Error_Resync
  480.  
  481.    --  Note: a pragma can also be returned in this position
  482.  
  483.    --  We are not currently permitting representation clauses to appear as
  484.    --  protected operation declarations, do we have to rethink this???
  485.  
  486.    function P_Protected_Operation_Declaration_Opt return Node_Id is
  487.    begin
  488.       --  This loop runs more than once only when a junk declaration
  489.       --  is skipped.
  490.  
  491.       loop
  492.          if Token = Tok_Pragma then
  493.             return P_Pragma;
  494.  
  495.          elsif Token = Tok_Entry then
  496.             return P_Entry_Declaration;
  497.  
  498.          elsif Token = Tok_Function or else Token = Tok_Procedure then
  499.             return P_Subprogram (Pf_Decl);
  500.  
  501.          elsif Token = Tok_Identifier
  502.            or else Token in Token_Class_Declk
  503.          then
  504.             Error_Msg_SC ("Illegal declaration in protected definition");
  505.             Resync_Past_Semicolon;
  506.  
  507.          else
  508.             return Empty;
  509.          end if;
  510.       end loop;
  511.    end P_Protected_Operation_Declaration_Opt;
  512.  
  513.    -----------------------------------
  514.    -- 9.4  Protected Operation Item --
  515.    -----------------------------------
  516.  
  517.    --  PROTECTED_OPERATION_ITEM ::=
  518.    --    SUBPROGRAM_DECLARATION
  519.    --  | SUBPROGRAM_BODY
  520.    --  | ENTRY_BODY
  521.    --  | REPRESENTATION_CLAUSE
  522.  
  523.    --  This procedure parses and returns a list of protected operation items
  524.  
  525.    --  We are not currently permitting representation clauses to appear
  526.    --  as protected operation items, do we have to rethink this???
  527.  
  528.    function P_Protected_Operation_Items return List_Id is
  529.       Item_List : List_Id;
  530.  
  531.    begin
  532.       Item_List := New_List;
  533.  
  534.       loop
  535.          if Token = Tok_Entry then
  536.             Append (P_Entry_Body, Item_List);
  537.  
  538.          elsif Token = Tok_Function or else Token = Tok_Procedure then
  539.             Append (P_Subprogram (Pf_Pbod), Item_List);
  540.  
  541.          elsif Token = Tok_Identifier then
  542.             Error_Msg_SC
  543.               ("all components must be declared in spec!");
  544.  
  545.             Resync_Past_Semicolon;
  546.  
  547.          elsif Token in Token_Class_Declk then
  548.             Error_Msg_SC ("illegal declaration in protected definition!");
  549.             Resync_Past_Semicolon;
  550.  
  551.          else
  552.             exit;
  553.          end if;
  554.       end loop;
  555.  
  556.       return Item_List;
  557.    end P_Protected_Operation_Items;
  558.  
  559.    ------------------------------
  560.    -- 9.5.2  Entry Declaration --
  561.    ------------------------------
  562.  
  563.    --  ENTRY_DECLARATION ::=
  564.    --    entry DEFINING_IDENTIFIER [(DISCRETE_SUBTYPE_DEFINITION)]
  565.    --      PARAMETER_PROFILE;
  566.  
  567.    --  The caller has checked that the initial token is ENTRY
  568.  
  569.    --  Error recovery: cannot raise Error_Resync
  570.  
  571.    function P_Entry_Declaration return Node_Id is
  572.       Decl_Node  : Node_Id;
  573.       Scan_State : Saved_Scan_State;
  574.  
  575.    begin
  576.       Decl_Node := New_Node (N_Entry_Declaration, Token_Ptr);
  577.       Scan; -- past ENTRY
  578.  
  579.       Set_Defining_Identifier (Decl_Node, P_Defining_Identifier);
  580.  
  581.       --  If left paren, could be (Discrete_Subtype_Definition) or Formal_Part
  582.  
  583.       if Token = Tok_Left_Paren then
  584.          Scan; -- past (
  585.  
  586.          --  If identifier after left paren, could still be either
  587.  
  588.          if Token = Tok_Identifier then
  589.             Save_Scan_State (Scan_State); -- at Id
  590.             Scan; -- past Id
  591.  
  592.             --  If comma or colon after Id, must be Formal_Part
  593.  
  594.             if Token = Tok_Comma or else Token = Tok_Colon then
  595.                Restore_Scan_State (Scan_State); -- to Id
  596.                Set_Parameter_Specifications (Decl_Node, P_Formal_Part);
  597.  
  598.             --  Else if Id wi no comma or colon, must be discrete subtype defn
  599.  
  600.             else
  601.                Restore_Scan_State (Scan_State); -- to Id
  602.                Set_Discrete_Subtype_Definition
  603.                  (Decl_Node, P_Discrete_Subtype_Definition);
  604.                T_Right_Paren;
  605.                Set_Parameter_Specifications (Decl_Node, P_Parameter_Profile);
  606.             end if;
  607.  
  608.          --  If no Id, must be discrete subtype definition
  609.  
  610.          else
  611.             Set_Discrete_Subtype_Definition
  612.               (Decl_Node, P_Discrete_Subtype_Definition);
  613.             T_Right_Paren;
  614.             Set_Parameter_Specifications (Decl_Node, P_Parameter_Profile);
  615.          end if;
  616.       end if;
  617.  
  618.       --  Error recovery check for illegal return
  619.  
  620.       if Token = Tok_Return then
  621.          Error_Msg_SC ("entry cannot have return value!");
  622.          Scan;
  623.          Discard_Junk_Node (P_Subtype_Indication);
  624.       end if;
  625.  
  626.       --  Error recovery check for improper use of entry barrier in spec
  627.  
  628.       if Token = Tok_When then
  629.          Error_Msg_SC ("barrier not allowed here (belongs in body)");
  630.          Scan; -- past WHEN;
  631.          Discard_Junk_Node (P_Expression_No_Right_Paren);
  632.       end if;
  633.  
  634.       TF_Semicolon;
  635.       return Decl_Node;
  636.    end P_Entry_Declaration;
  637.  
  638.    -----------------------------
  639.    -- 9.5.2  Accept Statement --
  640.    -----------------------------
  641.  
  642.    --  ACCEPT_STATEMENT ::=
  643.    --    accept entry_DIRECT_NAME
  644.    --      [(ENTRY_INDEX)] PARAMETER_PROFILE [do
  645.    --        HANDLED_SEQUENCE_OF_STATEMENTS
  646.    --    end [entry_IDENTIFIER]];
  647.  
  648.    --  The caller has checked that the initial token is ACCEPT
  649.  
  650.    --  Error recovery: cannot raise Error_Resync. If an error occurs, the
  651.    --  scan is resynchronized past the next semicolon and control returns.
  652.  
  653.    function P_Accept_Statement return Node_Id is
  654.       Scan_State  : Saved_Scan_State;
  655.       Accept_Node : Node_Id;
  656.       Hand_Seq    : Node_Id;
  657.  
  658.    begin
  659.       Push_Scope_Stack;
  660.       Scope.Table (Scope.Last).Sloc := Token_Ptr;
  661.       Scope.Table (Scope.Last).Ecol := Start_Column;
  662.  
  663.       Accept_Node := New_Node (N_Accept_Statement, Token_Ptr);
  664.       Scan; -- past ACCEPT
  665.       Scope.Table (Scope.Last).Labl := Token_Node;
  666.  
  667.       Set_Entry_Direct_Name (Accept_Node, P_Identifier);
  668.  
  669.       --  Left paren could be (Entry_Index) or Formal_Part, determine which
  670.  
  671.       if Token = Tok_Left_Paren then
  672.          Save_Scan_State (Scan_State); -- at left paren
  673.          Scan; -- past left paren
  674.  
  675.          --  If first token after left paren not identifier, then Entry_Index
  676.  
  677.          if Token /= Tok_Identifier then
  678.             Set_Entry_Index (Accept_Node, P_Expression);
  679.             T_Right_Paren;
  680.             Set_Parameter_Specifications (Accept_Node, P_Parameter_Profile);
  681.  
  682.          --  First token after left paren is identifier, could be either case
  683.  
  684.          else -- Token = Tok_Identifier
  685.             Scan; -- past identifier
  686.  
  687.             --  If identifier followed by comma or colon, must be Formal_Part
  688.  
  689.             if Token = Tok_Comma or else Token = Tok_Colon then
  690.                Restore_Scan_State (Scan_State); -- to left paren
  691.                Set_Parameter_Specifications (Accept_Node, P_Parameter_Profile);
  692.  
  693.             --  If identifier not followed by comma/colon, must be entry index
  694.  
  695.             else
  696.                Restore_Scan_State (Scan_State); -- to left paren
  697.                Scan; -- past left paren (again!)
  698.                Set_Entry_Index (Accept_Node, P_Expression);
  699.                T_Right_Paren;
  700.                Set_Parameter_Specifications (Accept_Node, P_Parameter_Profile);
  701.             end if;
  702.          end if;
  703.       end if;
  704.  
  705.       --  Scan out DO if present
  706.  
  707.       if Token = Tok_Do then
  708.          Scope.Table (Scope.Last).Etyp := E_Name;
  709.          Scope.Table (Scope.Last).Lreq := False;
  710.          Scan; -- past DO
  711.          Hand_Seq := P_Handled_Sequence_Of_Statements;
  712.          Set_Handled_Statement_Sequence (Accept_Node, Hand_Seq);
  713.          End_Statements;
  714.  
  715.          --  Exception handlers not allowed in Ada 95 node
  716.  
  717.          if Present (Exception_Handlers (Hand_Seq)) then
  718.             if Ada_83 then
  719.                Error_Msg_N
  720.                  ("(Ada 83) exception handlers in accept not allowed",
  721.                   First (Exception_Handlers (Hand_Seq)));
  722.             end if;
  723.  
  724.             Note_Feature (Exception_Handler_In_Accept, Sloc (Hand_Seq));
  725.          end if;
  726.  
  727.       else
  728.          Pop_Scope_Stack; -- discard unused entry
  729.          TF_Semicolon;
  730.       end if;
  731.  
  732.       return Accept_Node;
  733.  
  734.    --  If error, resynchronize past semicolon
  735.  
  736.    exception
  737.       when Error_Resync =>
  738.          Resync_Past_Semicolon;
  739.          return Error;
  740.  
  741.    end P_Accept_Statement;
  742.  
  743.    ------------------------
  744.    -- 9.5.2  Entry Index --
  745.    ------------------------
  746.  
  747.    --  Parsed by P_Expression (4.4)
  748.  
  749.    -----------------------
  750.    -- 9.5.2  Entry Body --
  751.    -----------------------
  752.  
  753.    --  ENTRY_BODY ::=
  754.    --    entry DEFINING_IDENTIFIER ENTRY_BODY_FORMAL_PART ENTRY_BARRIER is
  755.    --      DECLARATIVE_PART
  756.    --    begin
  757.    --      HANDLED_SEQUENCE_OF_STATEMENTS
  758.    --    end [entry_IDENTIFIER];
  759.  
  760.    --  The caller has checked that the initial token is ENTRY
  761.  
  762.    --  Error_Recovery: cannot raise Error_Resync
  763.  
  764.    function P_Entry_Body return Node_Id is
  765.       Entry_Node       : Node_Id;
  766.       Formal_Part_Node : Node_Id;
  767.       Iterator_Node    : Node_Id;
  768.       Name_Node        : Node_Id;
  769.  
  770.    begin
  771.       Push_Scope_Stack;
  772.       Entry_Node := New_Node (N_Entry_Body, Token_Ptr);
  773.       Scan; -- past ENTRY
  774.  
  775.       Scope.Table (Scope.Last).Ecol := Start_Column;
  776.       Scope.Table (Scope.Last).Lreq := False;
  777.       Scope.Table (Scope.Last).Etyp := E_Name;
  778.  
  779.       Name_Node := P_Defining_Identifier;
  780.       Set_Defining_Identifier (Entry_Node, Name_Node);
  781.       Scope.Table (Scope.Last).Labl := Name_Node;
  782.  
  783.       Formal_Part_Node := P_Entry_Body_Formal_Part;
  784.       Set_Entry_Body_Formal_Part (Entry_Node, Formal_Part_Node);
  785.  
  786.       Set_Condition (Formal_Part_Node, P_Entry_Barrier);
  787.       Parse_Decls_Begin_End (Entry_Node);
  788.       return Entry_Node;
  789.    end P_Entry_Body;
  790.  
  791.    -----------------------------------
  792.    -- 9.5.2  Entry Body Formal Part --
  793.    -----------------------------------
  794.  
  795.    --  ENTRY_BODY_FORMAL_PART ::=
  796.    --    [(ENTRY_INDEX_SPECIFICATION)] [PARAMETER_PART]
  797.  
  798.    --  Error_Recovery: cannot raise Error_Resync
  799.  
  800.    function P_Entry_Body_Formal_Part return Node_Id is
  801.       Fpart_Node : Node_Id;
  802.       Scan_State : Saved_Scan_State;
  803.  
  804.    begin
  805.       Fpart_Node := New_Node (N_Entry_Body_Formal_Part, Token_Ptr);
  806.  
  807.       --  See if entry index specification present, and if so parse it
  808.  
  809.       if Token = Tok_Left_Paren then
  810.          Save_Scan_State (Scan_State); -- at left paren
  811.          Scan; -- past left paren
  812.  
  813.          if Token = Tok_For then
  814.             Set_Entry_Index_Specification
  815.               (Fpart_Node, P_Entry_Index_Specification);
  816.             T_Right_Paren;
  817.          else
  818.             Restore_Scan_State (Scan_State); -- to left paren
  819.          end if;
  820.  
  821.       --  Check for (common?) case of left paren omitted before FOR. This
  822.       --  is a tricky case, because the corresponding missing left paren
  823.       --  can cause real havoc if a formal part is present which gets
  824.       --  treated as part of the discrete subtype definition of the
  825.       --  entry index specification, so just give error and resynchronize
  826.  
  827.       elsif Token = Tok_For then
  828.          T_Left_Paren; -- to give error message
  829.          Resync_To_When;
  830.       end if;
  831.  
  832.       Set_Parameter_Specifications (Fpart_Node, P_Parameter_Profile);
  833.       return Fpart_Node;
  834.    end P_Entry_Body_Formal_Part;
  835.  
  836.    --------------------------
  837.    -- 9.5.2  Entry Barrier --
  838.    --------------------------
  839.  
  840.    --  ENTRY_BARRIER ::= when CONDITION
  841.  
  842.    --  Error_Recovery: cannot raise Error_Resync
  843.  
  844.    function P_Entry_Barrier return Node_Id is
  845.       Bnode : Node_Id;
  846.  
  847.    begin
  848.       if Token = Tok_When then
  849.          Scan; -- past WHEN;
  850.          Bnode := P_Expression_No_Right_Paren;
  851.          T_Is;
  852.       else
  853.          T_When; -- to give error message
  854.          Bnode := Error;
  855.          TF_Is;
  856.       end if;
  857.  
  858.       return Bnode;
  859.    end P_Entry_Barrier;
  860.  
  861.    --------------------------------------
  862.    -- 9.5.2  Entry Index Specification --
  863.    --------------------------------------
  864.  
  865.    --  ENTRY_INDEX_SPECIFICATION ::=
  866.    --    for DEFINING_IDENTIFIER in DISCRETE_SUBTYPE_DEFINITION
  867.  
  868.    --  Error recovery: can raise Error_Resync
  869.  
  870.    function P_Entry_Index_Specification return Node_Id is
  871.       Iterator_Node : Node_Id;
  872.  
  873.    begin
  874.       Iterator_Node := New_Node (N_Entry_Index_Specification, Token_Ptr);
  875.       T_For; -- past FOR
  876.       Set_Defining_Identifier (Iterator_Node, P_Defining_Identifier);
  877.       T_In;
  878.       Set_Discrete_Subtype_Definition
  879.         (Iterator_Node, P_Discrete_Subtype_Definition);
  880.       return Iterator_Node;
  881.    end P_Entry_Index_Specification;
  882.  
  883.    ---------------------------------
  884.    -- 9.5.3  Entry Call Statement --
  885.    ---------------------------------
  886.  
  887.    --  Parsed by P_Name (4.1). Within a select, an entry call is parsed
  888.    --  by P_Select_Statement (9.7)
  889.  
  890.    ------------------------------
  891.    -- 9.5.4  Requeue Statement --
  892.    ------------------------------
  893.  
  894.    --  REQUEUE_STATEMENT ::= requeue entry_NAME [with abort];
  895.  
  896.    --  The caller has checked that the initial token is requeue
  897.  
  898.    --  Error recovery: can raise Error_Resync
  899.  
  900.    function P_Requeue_Statement return Node_Id is
  901.       Requeue_Node : Node_Id;
  902.  
  903.    begin
  904.       Requeue_Node := New_Node (N_Requeue_Statement, Token_Ptr);
  905.       Note_Feature (Requeue_Statement, Token_Ptr);
  906.       Scan; -- past REQUEUE
  907.       Set_Name (Requeue_Node, P_Name);
  908.  
  909.       if Token = Tok_With then
  910.          Scan; -- past WITH
  911.          T_Abort;
  912.          Set_Abort_Present (Requeue_Node, True);
  913.       end if;
  914.  
  915.       TF_Semicolon;
  916.       return Requeue_Node;
  917.    end P_Requeue_Statement;
  918.  
  919.    --------------------------
  920.    -- 9.6  Delay Statement --
  921.    --------------------------
  922.  
  923.    --  DELAY_STATEMENT ::=
  924.    --    DELAY_UNTIL_STATEMENT
  925.    --  | DELAY_RELATIVE_STATEMENT
  926.  
  927.    --  The caller has checked that the initial token is DELAY
  928.  
  929.    --  Error recovery: cannot raise Error_Resync
  930.  
  931.    function P_Delay_Statement return Node_Id is
  932.    begin
  933.       Scan; -- past DELAY
  934.  
  935.       --  The following check for delay until misused in Ada 83 doesn't catch
  936.       --  all cases, but it's good enough to catch most of them!
  937.  
  938.       if Token_Name = Name_Until then
  939.          Check_95_Keyword (Tok_Until, Tok_Left_Paren);
  940.          Check_95_Keyword (Tok_Until, Tok_Identifier);
  941.       end if;
  942.  
  943.       if Token = Tok_Until then
  944.          return P_Delay_Until_Statement;
  945.       else
  946.          return P_Delay_Relative_Statement;
  947.       end if;
  948.    end P_Delay_Statement;
  949.  
  950.    --------------------------------
  951.    -- 9.6  Delay Until Statement --
  952.    --------------------------------
  953.  
  954.    --  DELAY_UNTIL_STATEMENT ::= delay until delay_EXPRESSION;
  955.  
  956.    --  The caller has checked that the initial token is DELAY, scanned it
  957.    --  out and checked that the current token is UNTIL
  958.  
  959.    --  Error recovery: cannot raise Error_Resync
  960.  
  961.    function P_Delay_Until_Statement return Node_Id is
  962.       Delay_Node : Node_Id;
  963.  
  964.    begin
  965.       Note_Feature (Delay_Until, Prev_Token_Ptr);
  966.       Delay_Node := New_Node (N_Delay_Until_Statement, Prev_Token_Ptr);
  967.       Scan; -- past UNTIL
  968.       Set_Expression (Delay_Node, P_Expression_No_Right_Paren);
  969.       TF_Semicolon;
  970.       return Delay_Node;
  971.    end P_Delay_Until_Statement;
  972.  
  973.    -----------------------------------
  974.    -- 9.6  Delay Relative Statement --
  975.    -----------------------------------
  976.  
  977.    --  DELAY_RELATIVE_STATEMENT ::= delay delay_EXPRESSION;
  978.  
  979.    --  The caller has checked that the initial token is DELAY, scanned it
  980.    --  out and determined that the current token is not UNTIL
  981.  
  982.    --  Error recovery: cannot raise Error_Resync
  983.  
  984.    function P_Delay_Relative_Statement return Node_Id is
  985.       Delay_Node : Node_Id;
  986.  
  987.    begin
  988.       Delay_Node := New_Node (N_Delay_Relative_Statement, Prev_Token_Ptr);
  989.       Set_Expression (Delay_Node, P_Expression_No_Right_Paren);
  990.       Check_Simple_Expression_In_Ada_83 (Expression (Delay_Node));
  991.       TF_Semicolon;
  992.       return Delay_Node;
  993.    end P_Delay_Relative_Statement;
  994.  
  995.    ---------------------------
  996.    -- 9.7  Select Statement --
  997.    ---------------------------
  998.  
  999.    --  SELECT_STATEMENT ::=
  1000.    --    SELECTIVE_ACCEPT
  1001.    --  | TIMED_ENTRY_CALL
  1002.    --  | CONDITIONAL_ENTRY_CALL
  1003.    --  | ASYNCHRONOUS_SELECT
  1004.  
  1005.    --  SELECTIVE_ACCEPT ::=
  1006.    --    select
  1007.    --      [GUARD]
  1008.    --        SELECT_ALTERNATIVE
  1009.    --    {or
  1010.    --      [GUARD]
  1011.    --        SELECT_ALTERNATIVE
  1012.    --    [else
  1013.    --      SEQUENCE_OF_STATEMENTS]
  1014.    --    end select;
  1015.  
  1016.    --  GUARD ::= when CONDITION =>
  1017.  
  1018.    --  Note: the guard preceding a select alternative is included as part
  1019.    --  of the node generated for a selective accept alternative.
  1020.  
  1021.    --  SELECT_ALTERNATIVE ::=
  1022.    --    ACCEPT_ALTERNATIVE
  1023.    --  | DELAY_ALTERNATIVE
  1024.    --  | TERMINATE_ALTERNATIVE
  1025.  
  1026.    --  TIMED_ENTRY_CALL ::=
  1027.    --    select
  1028.    --      ENTRY_CALL_ALTERNATIVE
  1029.    --    or
  1030.    --      DELAY_ALTERNATIVE
  1031.    --    end select;
  1032.  
  1033.    --  CONDITIONAL_ENTRY_CALL ::=
  1034.    --    select
  1035.    --      ENTRY_CALL_ALTERNATIVE
  1036.    --    else
  1037.    --      SEQUENCE_OF_STATEMENTS
  1038.    --    end select;
  1039.  
  1040.    --  ENTRY_CALL_ALTERNATIVE ::=
  1041.    --    ENTRY_CALL_STATEMENT [SEQUENCE_OF_STATEMENTS]
  1042.  
  1043.    --  ASYNCHRONOUS_SELECT ::=
  1044.    --    select
  1045.    --      TRIGGERING_ALTERNATIVE
  1046.    --    then abort
  1047.    --      ABORTABLE_PART
  1048.    --    end select;
  1049.  
  1050.    --  TRIGGERING_ALTERNATIVE ::=
  1051.    --    TRIGGERING_STATEMENT [SEQUENCE_OF_STATEMENTS]
  1052.  
  1053.    --  TRIGGERING_STATEMENT ::= ENTRY_CALL_STATEMENT | DELAY_STATEMENT
  1054.  
  1055.    --  The caller has checked that the initial token is SELECT
  1056.  
  1057.    --  Error recovery: can raise Error_Resync
  1058.  
  1059.    function P_Select_Statement return Node_Id is
  1060.       Select_Node    : Node_Id;
  1061.       Select_Sloc    : Source_Ptr;
  1062.       Stmnt_Sloc     : Source_Ptr;
  1063.       Ecall_Node     : Node_Id;
  1064.       Alternative    : Node_Id;
  1065.       Statement_List : List_Id;
  1066.       Alt_List       : List_Id;
  1067.       Cond_Expr      : Node_Id;
  1068.       Delay_Stmnt    : Node_Id;
  1069.  
  1070.    begin
  1071.       Push_Scope_Stack;
  1072.       Scope.Table (Scope.Last).Etyp := E_Select;
  1073.       Scope.Table (Scope.Last).Ecol := Start_Column;
  1074.       Scope.Table (Scope.Last).Sloc := Token_Ptr;
  1075.       Scope.Table (Scope.Last).Labl := Error;
  1076.  
  1077.       Select_Sloc := Token_Ptr;
  1078.       Scan; -- past SELECT
  1079.       Stmnt_Sloc := Token_Ptr;
  1080.  
  1081.       --  If first token after select is designator, then we have an entry
  1082.       --  call, which must be the start of a conditional entry call, timed
  1083.       --  entry call or asynchronous select
  1084.  
  1085.       if Token in Token_Class_Desig then
  1086.  
  1087.          --  Scan entry call statement
  1088.  
  1089.          begin
  1090.             Ecall_Node := P_Name;
  1091.  
  1092.             if Nkind (Ecall_Node) = N_Indexed_Component then
  1093.                declare
  1094.                   Prefix_Node : Node_Id := Prefix (Ecall_Node);
  1095.                   Exprs_Node  : List_Id := Expressions (Ecall_Node);
  1096.                begin
  1097.                   Change_Node (Ecall_Node, N_Procedure_Call_Statement);
  1098.                   Set_Name (Ecall_Node, Prefix_Node);
  1099.                   Set_Parameter_Associations (Ecall_Node, Exprs_Node);
  1100.                end;
  1101.  
  1102.             elsif Nkind (Ecall_Node) = N_Identifier
  1103.               or else Nkind (Ecall_Node) = N_Selected_Component
  1104.             then
  1105.  
  1106.                --  Case of a call to a parameterless entry.
  1107.  
  1108.                declare
  1109.                   C_Node : constant Node_Id :=
  1110.                          New_Node (N_Procedure_Call_Statement, Stmnt_Sloc);
  1111.                begin
  1112.                   Set_Name (C_Node, Ecall_Node);
  1113.                   Set_Parameter_Associations (C_Node, No_List);
  1114.                   Ecall_Node := C_Node;
  1115.                end;
  1116.             end if;
  1117.  
  1118.             TF_Semicolon;
  1119.  
  1120.          exception
  1121.             when Error_Resync =>
  1122.                Resync_Past_Semicolon;
  1123.                return Error;
  1124.          end;
  1125.  
  1126.          Statement_List := P_Sequence_Of_Statements (SS_Eltm_Ortm_Tatm);
  1127.  
  1128.          --  OR follows, we have a timed entry call
  1129.  
  1130.          if Token = Tok_Or then
  1131.             Scan; -- past OR
  1132.  
  1133.             Select_Node := New_Node (N_Timed_Entry_Call, Select_Sloc);
  1134.             Set_Entry_Call_Alternative (Select_Node,
  1135.               Make_Entry_Call_Alternative (Stmnt_Sloc,
  1136.                 Entry_Call_Statement => Ecall_Node,
  1137.                 Statements => Statement_List));
  1138.  
  1139.             --  Only possibility is delay alternative. If we have anything
  1140.             --  else, give message, and treat as conditional entry call.
  1141.  
  1142.             if Token /= Tok_Delay then
  1143.                Error_Msg_SC
  1144.                   ("only allowed alternative in timed entry call is delay!");
  1145.                Discard_Junk_List (P_Sequence_Of_Statements (SS_Sreq));
  1146.                Set_Delay_Alternative (Select_Node, Error);
  1147.  
  1148.             else
  1149.                Set_Delay_Alternative (Select_Node, P_Delay_Alternative);
  1150.             end if;
  1151.  
  1152.          --  ELSE follows, we have a conditional entry call
  1153.  
  1154.          elsif Token = Tok_Else then
  1155.             Scan; -- past ELSE
  1156.  
  1157.             Select_Node := New_Node (N_Conditional_Entry_Call, Select_Sloc);
  1158.  
  1159.             Set_Entry_Call_Alternative (Select_Node,
  1160.               Make_Entry_Call_Alternative (Stmnt_Sloc,
  1161.                 Entry_Call_Statement => Ecall_Node,
  1162.                 Statements => Statement_List));
  1163.  
  1164.             Set_Else_Statements
  1165.               (Select_Node, P_Sequence_Of_Statements (SS_Sreq));
  1166.  
  1167.          --  Only remaining case is THEN ABORT (asynchronous select)
  1168.  
  1169.          elsif Token = Tok_Abort then
  1170.             Note_Feature (Asynchronous_Select, Select_Sloc);
  1171.             Select_Node :=
  1172.               Make_Asynchronous_Select (Select_Sloc,
  1173.                 Triggering_Alternative =>
  1174.                   Make_Triggering_Alternative (Stmnt_Sloc,
  1175.                     Triggering_Statement => Ecall_Node,
  1176.                     Statements => Statement_List),
  1177.                 Abortable_Part => P_Abortable_Part);
  1178.  
  1179.          --  Else error
  1180.  
  1181.          else
  1182.             if Ada_83 then
  1183.                Error_Msg_BC ("OR or ELSE expected");
  1184.             else
  1185.                Error_Msg_BC ("OR or ELSE or THEN ABORT expected");
  1186.             end if;
  1187.  
  1188.             Select_Node := Error;
  1189.          end if;
  1190.  
  1191.          End_Statements;
  1192.  
  1193.       --  Here we have a selective accept or an an asynchronous select (first
  1194.       --  token after SELECT is other than a designator token).
  1195.  
  1196.       else
  1197.          --  If we have delay with no guard, could be asynchronous select
  1198.  
  1199.          if Token = Tok_Delay then
  1200.             Delay_Stmnt := P_Delay_Statement;
  1201.             Statement_List := P_Sequence_Of_Statements (SS_Eltm_Ortm_Tatm);
  1202.  
  1203.             --  Asynchronous select
  1204.  
  1205.             if Token = Tok_Abort then
  1206.                Select_Node :=
  1207.                  Make_Asynchronous_Select (Select_Sloc,
  1208.                    Triggering_Alternative =>
  1209.                      Make_Triggering_Alternative (Stmnt_Sloc,
  1210.                        Triggering_Statement => Delay_Stmnt,
  1211.                        Statements => Statement_List),
  1212.                      Abortable_Part => P_Abortable_Part);
  1213.  
  1214.                End_Statements;
  1215.                return Select_Node;
  1216.  
  1217.             --  Delay which was not an asyncrhonous select. Must be a selective
  1218.             --  accept, and since at least one accept statement is required,
  1219.             --  we must have at least one OR phrase present.
  1220.  
  1221.             else
  1222.                Alt_List := New_List (
  1223.                  Make_Delay_Alternative (Stmnt_Sloc,
  1224.                    Delay_Statement => Delay_Stmnt,
  1225.                    Statements      => Statement_List));
  1226.                T_Or;
  1227.             end if;
  1228.  
  1229.          --  If not a delay statement, then must be another possibility
  1230.          --  for a selective accept alternative, or perhaps a guard is present
  1231.  
  1232.          else
  1233.             Alt_List := New_List;
  1234.          end if;
  1235.  
  1236.          Select_Node := New_Node (N_Selective_Accept, Select_Sloc);
  1237.          Set_Select_Alternatives (Select_Node, Alt_List);
  1238.  
  1239.          --  Scan out selective accept alternatives
  1240.  
  1241.          loop
  1242.             if Token = Tok_When then
  1243.                Scan; --  past WHEN
  1244.                Cond_Expr := P_Expression_No_Right_Paren;
  1245.                T_Arrow;
  1246.             else
  1247.                Cond_Expr := Empty;
  1248.             end if;
  1249.  
  1250.             if Token = Tok_Accept then
  1251.                Alternative := P_Accept_Alternative;
  1252.  
  1253.                --  Check for junk attempt at asynchronous select using
  1254.                --  an Accept alternative as the triggering statement
  1255.  
  1256.                if Token = Tok_Abort
  1257.                  and then Is_Empty_List (Alt_List)
  1258.                  and then No (Cond_Expr)
  1259.                then
  1260.                   Error_Msg
  1261.                     ("triggering statement must be entry call or delay",
  1262.                      Sloc (Alternative));
  1263.                   Scan; -- past junk ABORT
  1264.                   Discard_Junk_List (P_Sequence_Of_Statements (SS_Sreq));
  1265.                   End_Statements;
  1266.                   return Error;
  1267.                end if;
  1268.  
  1269.             elsif Token = Tok_Delay then
  1270.                Alternative := P_Delay_Alternative;
  1271.  
  1272.             elsif Token = Tok_Terminate then
  1273.                Alternative := P_Terminate_Alternative;
  1274.  
  1275.             else
  1276.                Error_Msg_SC
  1277.                  ("Select alternative (ACCEPT, ABORT, DELAY) expected");
  1278.                Alternative := Error;
  1279.  
  1280.                if Token = Tok_Semicolon then
  1281.                   Scan; -- past junk semicolon
  1282.                end if;
  1283.             end if;
  1284.  
  1285.             --  THEN ABORT at this stage is just junk
  1286.  
  1287.             if Token = Tok_Abort then
  1288.                Error_Msg_SP ("misplaced `THEN ABORT`");
  1289.                Scan; -- past junk ABORT
  1290.                Discard_Junk_List (P_Sequence_Of_Statements (SS_Sreq));
  1291.                End_Statements;
  1292.                return Error;
  1293.  
  1294.             else
  1295.                if Alternative /= Error then
  1296.                   Set_Condition (Alternative, Cond_Expr);
  1297.                   Append (Alternative, Alt_List);
  1298.                end if;
  1299.  
  1300.                exit when Token /= Tok_Or;
  1301.             end if;
  1302.  
  1303.             T_Or;
  1304.          end loop;
  1305.  
  1306.          if Token = Tok_Else then
  1307.             Scan; -- past ELSE
  1308.             Set_Else_Statements
  1309.               (Select_Node, P_Sequence_Of_Statements (SS_Ortm_Sreq));
  1310.  
  1311.             if Token = Tok_Or then
  1312.                Error_Msg_SC ("select alternative cannot follow else part!");
  1313.             end if;
  1314.          end if;
  1315.  
  1316.          End_Statements;
  1317.       end if;
  1318.  
  1319.       return Select_Node;
  1320.    end P_Select_Statement;
  1321.  
  1322.    -----------------------------
  1323.    -- 9.7.1  Selective Accept --
  1324.    -----------------------------
  1325.  
  1326.    --  Parsed by P_Select_Statement (9.7)
  1327.  
  1328.    ------------------
  1329.    -- 9.7.1  Guard --
  1330.    ------------------
  1331.  
  1332.    --  Parsed by P_Select_Statement (9.7)
  1333.  
  1334.    -------------------------------
  1335.    -- 9.7.1  Select Alternative --
  1336.    -------------------------------
  1337.  
  1338.    --  SELECT_ALTERNATIVE ::=
  1339.    --    ACCEPT_ALTERNATIVE
  1340.    --  | DELAY_ALTERNATIVE
  1341.    --  | TERMINATE_ALTERNATIVE
  1342.  
  1343.    --  Note: the guard preceding a select alternative is included as part
  1344.    --  of the node generated for a selective accept alternative.
  1345.  
  1346.    --  Error recovery: cannot raise Error_Resync
  1347.  
  1348.    -------------------------------
  1349.    -- 9.7.1  Accept Alternative --
  1350.    -------------------------------
  1351.  
  1352.    --  ACCEPT_ALTERNATIVE ::=
  1353.    --    ACCEPT_STATEMENT [SEQUENCE_OF_STATEMENTS]
  1354.  
  1355.    --  Error_Recovery: Cannot raise Error_Resync
  1356.  
  1357.    function P_Accept_Alternative return Node_Id is
  1358.       Accept_Alt_Node : Node_Id;
  1359.  
  1360.    begin
  1361.       Accept_Alt_Node := New_Node (N_Accept_Alternative, Token_Ptr);
  1362.       Set_Accept_Statement (Accept_Alt_Node, P_Accept_Statement);
  1363.  
  1364.       --  Note: the reason that we accept THEN ABORT as a terminator for
  1365.       --  the sequence of statements is for error recovery which allows
  1366.       --  for misuse of an accept statement as a triggering statememt.
  1367.  
  1368.       Set_Statements
  1369.         (Accept_Alt_Node, P_Sequence_Of_Statements (SS_Eltm_Ortm_Tatm));
  1370.       return Accept_Alt_Node;
  1371.    end P_Accept_Alternative;
  1372.  
  1373.    ------------------------------
  1374.    -- 9.7.1  Delay Alternative --
  1375.    ------------------------------
  1376.  
  1377.    --  DELAY_ALTERNATIVE ::=
  1378.    --    DELAY_STATEMENT [SEQUENCE_OF_STATEMENTS]
  1379.  
  1380.    --  Error_Recovery: Cannot raise Error_Resync
  1381.  
  1382.    function P_Delay_Alternative return Node_Id is
  1383.       Delay_Alt_Node : Node_Id;
  1384.  
  1385.    begin
  1386.       Delay_Alt_Node := New_Node (N_Delay_Alternative, Token_Ptr);
  1387.       Set_Delay_Statement (Delay_Alt_Node, P_Delay_Statement);
  1388.  
  1389.       --  Note: the reason that we accept THEN ABORT as a terminator for
  1390.       --  the sequence of statements is for error recovery which allows
  1391.       --  for misuse of an accept statement as a triggering statememt.
  1392.  
  1393.       Set_Statements
  1394.         (Delay_Alt_Node, P_Sequence_Of_Statements (SS_Eltm_Ortm_Tatm));
  1395.       return Delay_Alt_Node;
  1396.    end P_Delay_Alternative;
  1397.  
  1398.    ----------------------------------
  1399.    -- 9.7.1  Terminate Alternative --
  1400.    ----------------------------------
  1401.  
  1402.    --  TERMINATE_ALTERNATIVE ::= terminate;
  1403.  
  1404.    --  Error_Recovery: Cannot raise Error_Resync
  1405.  
  1406.    function P_Terminate_Alternative return Node_Id is
  1407.       Terminate_Alt_Node : Node_Id;
  1408.  
  1409.    begin
  1410.       Terminate_Alt_Node := New_Node (N_Terminate_Alternative, Token_Ptr);
  1411.       Scan; -- past TERMINATE
  1412.       TF_Semicolon;
  1413.       return Terminate_Alt_Node;
  1414.    end P_Terminate_Alternative;
  1415.  
  1416.    -----------------------------
  1417.    -- 9.7.2  Timed Entry Call --
  1418.    -----------------------------
  1419.  
  1420.    --  Parsed by P_Select_Statement (9.7)
  1421.  
  1422.    -----------------------------------
  1423.    -- 9.7.2  Entry Call Alternative --
  1424.    -----------------------------------
  1425.  
  1426.    --  Parsed by P_Select_Statement (9.7)
  1427.  
  1428.    -----------------------------------
  1429.    -- 9.7.3  Conditional Entry Call --
  1430.    -----------------------------------
  1431.  
  1432.    --  Parsed by P_Select_Statement (9.7)
  1433.  
  1434.    --------------------------------
  1435.    -- 9.7.4  Asynchronous Select --
  1436.    --------------------------------
  1437.  
  1438.    --  Parsed by P_Select_Statement (9.7)
  1439.  
  1440.    -----------------------------------
  1441.    -- 9.7.4  Triggering Alternative --
  1442.    -----------------------------------
  1443.  
  1444.    --  Parsed by P_Select_Statement (9.7)
  1445.  
  1446.    ---------------------------------
  1447.    -- 9.7.4  Triggering Statement --
  1448.    ---------------------------------
  1449.  
  1450.    --  Parsed by P_Select_Statement (9.7)
  1451.  
  1452.    ---------------------------
  1453.    -- 9.7.4  Abortable Part --
  1454.    ---------------------------
  1455.  
  1456.    --  ABORTABLE_PART ::= SEQUENCE_OF_STATEMENTS
  1457.  
  1458.    --  The caller has verified that THEN ABORT is present, and Token is
  1459.    --  pointing to the ABORT on entry (or if not, then we have an error)
  1460.  
  1461.    --  Error recovery: cannot raise Error_Resync
  1462.  
  1463.    function P_Abortable_Part return Node_Id is
  1464.       Abortable_Part_Node : Node_Id;
  1465.  
  1466.    begin
  1467.       Abortable_Part_Node := New_Node (N_Abortable_Part, Token_Ptr);
  1468.       T_Abort; -- scan past ABORT
  1469.  
  1470.       if Ada_83 then
  1471.          Error_Msg_SP ("(Ada 83) asynchronous select not allowed!");
  1472.       end if;
  1473.  
  1474.       Set_Statements (Abortable_Part_Node, P_Sequence_Of_Statements (SS_Sreq));
  1475.       return Abortable_Part_Node;
  1476.    end P_Abortable_Part;
  1477.  
  1478.    --------------------------
  1479.    -- 9.8  Abort Statement --
  1480.    --------------------------
  1481.  
  1482.    --  ABORT_STATEMENT ::= abort task_NAME {, task_NAME};
  1483.  
  1484.    --  The caller has checked that the initial token is ABORT
  1485.  
  1486.    --  Error recovery: cannot raise Error_Resync
  1487.  
  1488.    function P_Abort_Statement return Node_Id is
  1489.       Abort_Node : Node_Id;
  1490.  
  1491.    begin
  1492.       Abort_Node := New_Node (N_Abort_Statement, Token_Ptr);
  1493.       Scan; -- past ABORT
  1494.       Set_Names (Abort_Node, New_List);
  1495.  
  1496.       loop
  1497.          Append (P_Name, Names (Abort_Node));
  1498.          exit when Token /= Tok_Comma;
  1499.          Scan; -- past comma
  1500.       end loop;
  1501.  
  1502.       TF_Semicolon;
  1503.       return Abort_Node;
  1504.    end P_Abort_Statement;
  1505.  
  1506. end Ch9;
  1507.