8.2 Fortran 95数式
このセクションにはFortran 95における数式の構文とセマンティックスに関する 簡単な参照ガイドが含まれています。 詳細はMetcalf, Reid, Cohen著“Fortran 95/2003 Explained”、または Fortran 95標準“IS 1539-1:1997”をご参照ください。
- 構文要素の定義は‘::=’によって表されます。
- イタリック体の名前(例えば‘expr’ )は構文要素名です。
- ‘[ ]’中の項目は省略可能です。
- 省略符号‘...’は直前の項目の省略可能な繰返しを意味します。
- ‘{’と‘}’はグルーピングにのみ使用されます。
- ‘|’で区分された項目はその中のどれか一つという選択を表します。
一般形式
数式expr の一般形式は次の通りです:
expr ::= [ unary-operator ] operand [ binary-operator operand ]... |
operand ::= | literal-constant | object | array-constructor | |
structure-constructor | function-reference | ( expr ) |
binary-operator ::= | + | - | * | / | ** | == | /= | < | > | <= | >= | // | |
.AND. | .OR. | .EQV. | .NEQV. | user-operator |
unary-operator ::= + | - | .NOT. | user-operator |
user-operator ::= . letter[letter...]. |
演算子==
, /=
, <
, >
, <=
, >=
はそれぞれ
.EQ.
, .NE.
, .LT.
, .GT.
, .LE.
, .GE.
と
表現することもできます。
演算子
二項演算子は左から右に結合されます。ただし例外はべき乗で、右から左に結合されま す。 個々の演算子の優先順位を高いものから順に示したものが次の表です:
演算子 | 二項/単項 |
user-operator | Unary |
** | Binary |
* / | Binary |
+ - | Unary |
+ - | Binary |
// | Binary |
== /= < > <= >= | Binary |
.NOT. | Unary |
.AND. | Binary |
.OR. | Binary |
.EQV. .NEQV. | Binary |
user-operator | Binary |
定数表現
literal-constant ::= | integer-literal | real-literal | double-precision-literal | |
logical-literal | complex-literal | character-literal |
integer-literal ::= digit-string [ _ kind-specifier ] |
digit-string ::= { 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 }... |
kind-specifier ::= digit-string | name |
注:name はINTEGER PARAMETER
名でなくてはなりません。
例:
42 17_1 32767_int16
real-literal ::= | mantissa [ E exponent ] [ _ kind-specifier ] | |
digit-string E exponent [ _ kind-specifier ] |
mantissa ::= | digit-string . [ digit-string ] | |
. digit-string |
exponent ::= [ + | - ] digit-string |
例:
4.2 .7_1 327E+67_real64
double-precision-literal ::= { mantissa | digit-string } D exponent |
例:
4d2 1.7D-10
logical-literal ::= { .TRUE. | .FALSE. } [ _ kind-specifier ] |
complex-literal ::= ( int-or-real-literal , int-or-real-literal ) |
int-or-real-literal ::= integer-literal | real-literal |
例:
(42,17_1) (0,1d0)
character-literal ::= [ kind-specifier _ ] { ' [char...] ' | " [char...] " } |
注:char は引用符以外の任意の文字、または2重に入力された引用符を意味しま
す(例えば''''
は"'"
と同一です)。
例:
'42' "Say 'Hello'."
定数
constant ::= literal-constant | name |
名前付き定数はPARAMETER
文、またはPARAMETER
属性を伴う型宣言文に
よって宣言されます。
オブジェクト
object ::= object-ref [ % object-ref ]... [ ( substring-range ) ] |
object-ref ::= name [ section-subscript-list ] |
section-subscript-list ::= ( section-subscript [ , section-subscript ]... ) |
section-subscript ::= expr | triplet |
triplet ::= [ expr ] : [ expr ] [ : expr ] |
substring-range ::= [ expr ] : [ expr ] |
name ::= letter [ letter | digit | _ ] ... |
letter ::= | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | |
X | Y | Z |
variable ::= object |
constant-subobject ::= object | character-literal ( substring-range ) |
注:variable について、最初のobject-ref 中の名前は変数名でなくては
なりません。
constant-subobjectについて、最初のobject-ref 中の名前は定数名
(すなわちPARAMETER
)でなくてはなりません。
array elementは、その最終object-ref がsection-subscript-list を含むスカラオブジェクトです。ただし個々のsection-subscript はスカラ数式 とします。 例えば
ARRAY(I,J) SCALAR%ARRAY(I,J)structure componentは複数のobject-ref を持つオブジェクトです。 ただし最終のobject-ref はsection-subscript-list を持たず、 先行するすべてのobject-ref はスカラとします。 例えば
SCALAR%SCALAR ARRAY(I,J)%SCALARsubstringはsubstring-range を持ったスカラオブジェクトです。 例えば
SCALAR(I:J) ARRAY(I,J)(K:L)whole arrayは一つのobject-ref のみを持った配列オブジェクトです。
array sectionは、最終でないobject-ref が0でない次元数を持つか、また は最終のobject-ref が一つのsection-subscript-list を持ち、その section-subscripts が0でない次元数を持つかtriplet である配列オブジェ クトです。 例えば
ARRAY(2:M) ARRAY%SCALAR
配列構成子
array-constructor ::= (/ ac-item [ , ac-item ] ... /) |
ac-item ::= expr | ac-implied-do |
ac-implied-do ::= ( expr [ , expr ] ... , name = expr , expr [ , expr ] ) |
注:name は整数変数名ですが、その値は配列構成子の実行によって影響されま せん。 配列構成子のすべての数式は同一の型と型パラメータを有していなくてはなりません。 特に文字については、それらは同一長でなくてはなりません。
構造体構成子
structure-constructor ::= name ( expr [ , expr ] ... ) |
注:name は構造型の名前でなくてはなりません。 個々の数式は対応する構造型成分と代入互換である必要があります。
関数引用
function-reference ::= name ( [ expr [ , expr ] ... ] ) |
注:name は関数名でなくてはなりません。