separate (Compilation_Unit.Produce_Metrics)
procedure Sequence_Of_Statements
             (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

    --======================================================
    -- Sequence_Of_Statements ::=
    --   Pragma_Clause Label Statement Pragma_Clause
    --   { Label Statement Pragma_Clause }
    --======================================================

    Peek_Ahead_Token : Token_Package.Token;
    No_More_Statements : Boolean := False;

begin
    -- Sequence_Of_Statements

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

    Process_Statements:
        -- repeat for every statement
        loop

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

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

            -- increment LOC executable statement count
            Loc.Change_Executable_Statements_Count;

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

            Peek_Ahead_Token := Peek (From => Current_Compilation_Unit);
            case Token_Package.Class_Of (Peek_Ahead_Token) is

                when Token_Package.Keyword =>

                    case Token_Package.Value_Of (Peek_Ahead_Token) is

                        when Token_Package.Abort_Token |
                             Token_Package.Delay_Token |
                             Token_Package.Exit_Token |
                             Token_Package.Goto_Token |
                             Token_Package.Null_Token |
                             Token_Package.Raise_Token |
                             Token_Package.Return_Token |
                             Token_Package.Accept_Token |
                             Token_Package.Case_Token | Token_Package.If_Token |
                             Token_Package.While_Token |
                             Token_Package.For_Token |
                             Token_Package.Loop_Token |
                             Token_Package.Select_Token =>

                            null;

                        when others =>
                            No_More_Statements := True;

                    end case;

                when Token_Package.Punctuation =>

                    if "/=" (Token_Package.Value_Of (Peek_Ahead_Token),
                             Token_Package.Left_Label_Bracket_Token) then

                        No_More_Statements := True;

                    end if;

                when Token_Package.Identifier |
                     Token_Package.Standard_String_Literal |
                     Token_Package.Alternate_String_Literal |
                     Token_Package.Character_Literal =>

                    null;

                when Token_Package.Begin_Compilation_Unit =>
                    null;

                when others =>
                    No_More_Statements := True;

            end case;

            exit Process_Statements when No_More_Statements;

        end loop Process_Statements;

end Sequence_Of_Statements;