8.1 Fortran 95 Program Structure

This section contains a quick reference guide to the structure of a Fortran 95 program.

Expressions are described in the next section.

INCLUDE Line

The INCLUDE line has the form:

INCLUDE char-literal-constant

The char-literal-constant must not have a kind-param and must be the pathname of an accessible file; relative pathnames will be searched for in the current working directory and all directories named by -I options. The INCLUDE line is effectively replaced by the contents of the named file.

Program Unit Structure

program-unit ::= main-program | module | procedure | block-data-subprogram

main-program ::= [ program-stmt ]
body
end-program-stmt

body ::= declaration-section
[ executable-section ]
[ contains-section ]

Note: A contains-section cannot appear in an internal procedure (an internal procedure is a procedure in the contains-section of another procedure).

contains-section ::= contains-stmt
procedure...

module ::= module-stmt
[ declaration-section ]
[ contains-section ]
end-module-stmt

procedure ::= function-subprogram | subroutine-subprogram

function-subprogram ::= function-stmt
body
end-function-stmt

subroutine-subprogram ::= subroutine-stmt
body
end-subroutine-stmt

block-data-subprogram ::= block-data-stmt
declaration-section
end-block-data-stmt

Declaration Section

declaration-section ::= [ use-stmt... ]
[ implicit-part... ]
[ declaration... ]

implicit-part ::= implicit-stmt | parameter-stmt | format-stmt | entry-stmt

declaration ::= derived-type-definition | interface-block | declarative |
format-stmt | entry-stmt

declarative ::= allocatable-stmt | common-stmt | data-stmt | dimension-stmt |
equivalence-stmt | external-stmt | intent-stmt | intrinsic-stmt | namelist-stmt |
optional-stmt | parameter-stmt | pointer-stmt | private-stmt | public-stmt |
save-stmt | statement-function-stmt | target-stmt | type-declaration-stmt

derived-type-definition ::= type-stmt
component-def-stmt...
end-type-stmt

interface-block ::= interface-stmt
{ interface-body | module-procedure-stmt } ...
end-interface-stmt

interface-body ::= function-stmt declaration-section end-function-stmt |
subroutine-stmt declaration-section end-subroutine-stmt

Executable Section

executable-section ::= [ executable | executable-construct | data-stmt ]...

executable ::= allocate-stmt | arithmetic-if-stmt | assignment-stmt | backspace-stmt | call-stmt |
close-stmt | computed-goto-stmt | continue-stmt | cycle-stmt | deallocate-stmt
| endfile-stmt | exit-stmt | forall-stmt | goto-stmt | if-stmt | inquire-stmt |
nullify-stmt | open-stmt | pause-stmt | pointer-assignment-stmt | print-stmt |
read-stmt | return-stmt | rewind-stmt | stop-stmt | where-stmt | write-stmt

executable-construct ::= select-case-construct | do-loop | forall-construct | if-construct |
where-construct

select-case-construct ::= select-stmt
[ case-stmt executable-section ] ...
end-select-stmt

if-construct ::= if-then-stmt
[ executable-section ]
[ elseif-stmt executable-section ] ...
[ else-stmt executable-section ]
endif-stmt

where-construct ::= where-construct-stmt
where-body
[ elsewhere-stmt where-body ]
endwhere-stmt

where-body ::= [ where-assignment-stmt | where-stmt | where-construct |
elsewhere-mask-stmt ] ...

forall-construct ::= forall-construct-stmt
forall-body
end-forall-stmt

forall-body ::= [ forall-assignment-stmt | where-stmt | where-construct | forall-stmt |
forall-construct ] ...

do-loop ::= do-stmt
executable-section
do-ending

do-ending ::= enddo-stmt | executable

Note: If the do-stmt specifies a terminating label, the do-ending is the statement with that label and shall not be a goto-stmt, return-stmt, stop-stmt, exit-stmt, cycle-stmt, arithmetic-if-stmt or any form of END statement. If the do-stmt does not specify a terminating label, the do-ending shall be an enddo-stmt.