separate (Compilation_Unit.Produce_Metrics)
procedure Select_Alternative
             (Current_Compilation_Unit : in out Ada_Compilation_Unit;
              Program_Unit : in Program_Unit_State_Machine;
              Halstead : in Halstead_State_Machine;
              Loc : in Loc_State_Machine;
              Mccabe : in Mccabe_State_Machine) is

    --=========================================================
    -- Select_Alternative ::=
    --    [ "WHEN" Expression "=>" ]
    --    Pragma_Clause
    --    Selective_Wait_Alternative
    --    Pragma_Clause
    --=========================================================

    Current_Token : Token_Package.Token;

begin
    -- Select_Alternative

    if Token_Package.Value_Of (Peek (From => Current_Compilation_Unit)) =
       Token_Package.When_Token then

        Get_Next_Token (Out_Token => Current_Token,
                        From => Current_Compilation_Unit,
                        Current_Loc => Loc);

        -- increment Halstead WHEN operator count
        Halstead.Store_Operator ((Kind => Halstead_Operator.When_Halstead));

        -- increment McCabe PI
        Mccabe.Change_Pi;

        -- until "=>" is found
        Expression
           (Current_Compilation_Unit => Current_Compilation_Unit,
            Program_Unit => Program_Unit,
            Halstead => Halstead,
            Loc => Loc,
            Mccabe => Mccabe,
            Terminate_Tokens => Set_Of_Tokens'(1 => Token_Package.Arrow_Token));

        Get_Next_Token (Out_Token => Current_Token,
                        From => Current_Compilation_Unit,
                        Current_Loc => Loc);

        if "/=" (Token_Package.Value_Of (Current_Token),
                 Token_Package.Arrow_Token) then
            raise Syntax_Error;
        end if;

        -- increment Halstead ARROW operator count
        Halstead.Store_Operator ((Kind => Halstead_Operator.Arrow_Halstead));

    end if;

    Pragma_Clause (Current_Compilation_Unit => Current_Compilation_Unit,
                   Program_Unit => Program_Unit,
                   Halstead => Halstead,
                   Loc => Loc,
                   Mccabe => Mccabe);

    Selective_Wait_Alternative
       (Current_Compilation_Unit => Current_Compilation_Unit,
        Program_Unit => Program_Unit,
        Halstead => Halstead,
        Loc => Loc,
        Mccabe => Mccabe);

    Pragma_Clause (Current_Compilation_Unit => Current_Compilation_Unit,
                   Program_Unit => Program_Unit,
                   Halstead => Halstead,
                   Loc => Loc,
                   Mccabe => Mccabe);

end Select_Alternative;