この章では、スクリプトを構成する (ステートメント) について定義する。

Statements
Statement*
Statement
EmptyStatement
LabeledStatement
ExpressionStatement
VariableStatement
PrintStatement
IfStatement
WhileStatement
DoWhileStatement
ForStatement
BreakStatement
ContinueStatement
ReturnStatement
ThrowStatement
TryStatement
InnerStatement
Block
!LeftBrace Statement

Statements: Statement* の実行は次のように行う:

  1. Statements に Statement が一つも含まれない場合は、[[初期の Void.void]] を返す。
  2. Statements に含まれる Statement の数を n とする。
  3. i = 1, 2, …, n について、i = 1 から i = n まで順に以下の処理を行う:
    1. i 番目の Statement を実行する。その結果が正常終了でなければ、直ちにそれを返す。
  4. 最後に実行した Statement (n 番目の Statement) の結果を返す。

Statement の実行は、それを構成する一つの文 s を実行し、その結果を返す。Statement の実行において名前が与えられている場合は、 s を実行する際にも同じ名前を与える。

InnerStatement の実行は、それを構成する Block または Statement を実行し、その結果を返す。InnerStatement の実行において 名前が与えられている場合は、Block または Statement を実行する際にも同じ名前を与える。

文の終わり

EOS
Semicolon
&RightBrace
EOC

一部の例外を除いて、#Script の全ての文およびコマンドは EOS で終わる。EOS は原則として一つのセミコロントークンで構成されるが、次の場合には これを省略できる:

ブロック

Block
LeftBrace Statements RightBrace

ブロックは複数の文をまとめて一つの文として扱うことができるように するものである。

Block: LeftBrace Statements RightBrace の実行は、Statements を実行し、その結果を返す。

空文

EmptyStatement
Semicolon
Semicolon
; D

空文は何の処理も行わない文である。

EmptyStatement: Semicolon の実行結果は、[[初期の Void.void]] である。

ラベル文

LabeledStatement
LabelKeyword Identifier Colon InnerStatement
LabelKeyword
@label KD

ラベル文は、文に名前を与えるものである。 名前は、反復文の実行に影響する。

LabeledStatement: LabelKeyword Identifier Colon InnerStatement の実行は次のように行う:

  1. Identifier トークンを構成する Unicode 文字列n とする。
  2. 文の名前として n を与えて InnerStatement を実行し、その結果を r とする。
  3. r が break 終了であり、その移動先が n に等しければ、 [[初期の Void.void]] を返す。
  4. r が continue 終了であり、その移動先が n に等しければ、この LabeledStatement の実行の初めに戻る。
  5. r を返す。

名前を与えて文を実行することは、特に明示しない限り、 通常の方法で文を実行することと同じである。 一部の文は、名前を与えて実行した際に通常とは異なる振る舞いをする。

一つの文に与えることの出来る名前は一つまでである。 ラベル文を入れ子にすることは可能であるが、 最も内側のラベル文で指定された名前のみが文に与えられる。

ラベルの識別子は変数のスコープとは無関係なため、 複数のラベル文で同じ名前を指定することは可能であるが、避けるのが望ましい。

式文

ExpressionStatement
Expression EOS

式文は、一つのによって構成される文である。

ExpressionStatement: Expression EOS の実行は、Expression を評価し、その結果に対して get-reference-value を実行し、その結果を返す。

変数宣言文

VariableStatement
VarKeyword Variables EOS
VarKeyword
@var KD
Variables
Variable (Comma Variable)*
Variable
VariableInit
VariableIdentifier
VariableInit
(VariableIdentifier Equal)+ Condition
VariableIdentifier
Identifier

変数宣言文は、現在の変数領域に変数を定義するための文である。

VariableStatement: VarKeyword Variables EOS の実行は、Variables を実行し、その結果に対して get-reference-value を実行し、その結果を返す。

Variables: Variable (Comma Variable)* の実行は次のように行う:

  1. Variables に含まれる Variable の数を n とする。
  2. i = 1, 2, …, n について、i = 1 から i = n まで順に以下の処理を行う:
    1. i 番目の Variable を実行する。 その結果が正常終了でなければ、直ちにそれを返す。
  3. 最後に実行した Variable (n 番目の Variable) の結果を返す。

Variable: VariableInit の実行は、VariableInit を実行し、その結果を返す。

Variable: VariableIdentifier の実行は、VariableIdentifier を実行し、その結果を返す。

VariableInit: (VariableIdentifier Equal)+ Condition の実行は次のように行う:

  1. Condition を実行し、その結果に対して get-reference-value を実行し、その結果を c とする。
  2. c が正常終了でなければ、それを返す。
  3. VariableInit に含まれる VariableIdentifier の数を n とする。
  4. i = n, n − 1, …, 2, 1 について、i = n から i = 1 まで順に以下の処理を行う:
    1. i 番目の VariableIdentifier を実行し、その結果を v とする。
    2. v の値と c の値に対してset-reference-value を実行する。その結果が正常終了でなければ、直ちにそれを返す。
  5. 最後に実行した set-reference-value の結果を返す。

VariableIdentifier: Identifier の実行は次のように行う:

  1. Identifier トークンを構成する Unicode 文字列n とする。
  2. 現在の実行コンテクスト変数領域d とする。
  3. dn を名前とするメンバが存在しないならば、初期の Void.void を値としてそのメンバを作成する。既にメンバが存在するならば、何もしない。
  4. [[d を参照先オブジェクトとし n を参照先メンバ名とするメンバ参照]] を返す。

最も簡単な変数宣言文の例である:

@var a;

変数をカンマで区切ることで、複数の変数を宣言できる:

@var a, b, c;

変数を宣言すると同時に初期値を代入できる:

@var a = 1, b = 2, c = 3;

複数の変数を同じ値で初期化するには、変数を等号でつなげて書くことができる:

@var a = b = c = 0;

変数を初期化しない場合、その変数は Void.void で初期化される。 既に存在している変数に対して変数宣言文を実行した場合、等号による代入が あれば改めて新たな値が代入されるが、変数名が書かれているだけの場合は 何も起こらない。

ECMAScript とは異なり、変数は実行コンテクストが作成されるときではなく 変数宣言文が実行されるときに作成される。

PrintStatement
PrintKeyword Expressions? EOS
PrintKeyword
@print KD
@printline KD
@p KD
@pl KD

Print 文は、文字列データを出力する。 文字列データを出力することの具体的な処理内容は、実行環境に依存する。

PrintStatement: PrintKeyword Expression? EOS の実行は次のように行う:

  1. PrintStatement に Expressions が含まれるならば、それを評価し、 その結果が正常終了でなければそれを結果として返す。 正常終了ならばその結果の値を実行環境の定める方法により出力する。
  2. PrintStatement の PrintKeyword に @printline または @pl が含まれるならば、実行環境の定める方法により改行を出力する。
  3. [[初期の Void.void]] を返す。

@p@pl はそれぞれ @print@printline の略記である。

選択文

If 文

IfStatement
IfKeyword Expression Colon InnerStatement TrailingElse
TrailingElse
ElseIf* Else?
ElseIf
ElseIfKeyword Expression Colon InnerStatement
Else
ElseKeyword Colon InnerStatement
IfKeyword
@if KD
ElseIfKeyword
@elseif KD
@elsif KD
@elif KD
ElseKeyword
@else KD

If 文は、条件式を評価し、それが真ならばその直後の文を、偽ならば else 節の文を (それがある場合)、実行する。

IfStatement の実行は、次のように行う:

  1. Expression を評価し、その結果に対し get-reference-value を行い、その結果を c とする。
  2. c が正常終了でなければそれを返す。
  3. c の値に対して to-boolean を実行し、その結果が true ならば InnerStatement を実行しその結果を返す。
  4. TrailingElse を実行し、その結果を返す。

TrailingElse の実行は、次のように行う:

  1. TrailingElse に ElseIf が一つ以上含まれるならば、それらを E1, E2, …, Em とし、i = 1, 2, …, m について i = 1 から i = m まで順に以下の処理を行う:
    1. Ei の Expression を評価し、その結果に対し get-reference-value を行い、その結果を ci とする。
    2. ci が正常終了でなければそれを返す。
    3. ci の値に対して to-boolean を実行し、その結果が true ならば Ei の InnerStatement を実行しその結果を返す。
  2. TrailingElse に Else が含まれるならば、Else の InnerStatement を実行し、その結果を返す。
  3. [[初期の Void.void]] を返す。

構文規則により、Else または ElseIf は それが対応し得る if 文のうち最も近いものに対応する。

以下は、if 文の例である:

@if value < min: {
   @return min;
} @elseif value > max: {
   @return max;
} @else: {
   @return value;
}

@else キーワードの直後にもコロンが必要である。

反復文

While 文

WhileStatement
WhileKeyword Expression Colon InnerStatement TrailingElse
WhileKeyword
@while KD

While 文は条件が真の間、文の実行を繰り返す。 条件が初めから偽ならば、文は一度も実行されない。

WhileStatement の実行は、次のように行う:

  1. Expression を評価し、その結果に対し get-reference-value を行い、その結果を c とする。
  2. c が正常終了でなければそれを結果として終了する。
  3. c の値に対して to-boolean を実行し、その結果が false ならば TrailingElse を実行しその結果を返す。
  4. InnerStatement を実行し、その結果を r とする。
  5. r が正常終了ならば、この WhileStatement の実行の初めに戻る。
  6. r が break 終了で、その移動先の Unicode 文字列が 0 文字の文字列ならば、[[初期の Void.void]] を返す。
  7. r が continue 終了で、その移動先の Unicode 文字列が 0 文字の文字列ならばこの WhileStatement の実行の初めに戻る。
  8. r を返す。

以下は while 文の例である:

@while !ready:
   wait[];

While 文にも if 文同様に else 節を付けることが出来る。While 文のループ条件が成り立たなくなると、else 節が実行される。しかし break 文でループから脱出する場合には、else 節は実行されない。

Do-while 文

DoWhileStatement
DoKeyword Colon InnerStatement WhileKeyword Expression EOS
DoKeyword
@do KD

Do-while 文は条件が真の間、文の実行を繰り返す。 条件が評価される前に文が一度実行される。

DoWhileStatement の実行は、次のように行う:

  1. InnerStatement を実行し、その結果を r とする。
  2. r が break 終了で、その移動先の Unicode 文字列が 0 文字の文字列ならば、[[初期の Void.void]] を返す。
  3. r が continue 終了で、その移動先の Unicode 文字列が次のどちらかの条件を満たせば、Expression の評価 (*1) に進む:
  4. r が正常終了でなければ、それを返す。
  5. *1: Expression を評価し、その結果に対し get-reference-value を行い、その結果を c とする。
  6. c が正常終了でなければそれを返す。
  7. c の値に対して to-boolean を実行し、その結果が false ならば [[初期の Void.void]] を返す。
  8. この DoWhileStatement の実行の初めに戻る。

以下は do-while 文の例である:

@do {
   try[];
} @while !success;

Do-while 文には else 節は付けられない。

For 文

ForStatement
ForKeyword VarKeyword? Identifier ForSeparator Expression Colon InnerStatement TrailingElse
ForKeyword
@for KD
ForSeparator
@in KD
in KD
Colon

For 文は、指定された列挙オブジェクトが列挙する各オブジェクトに対して反復処理を行う。

ForStatement の実行は、次のように行う:

  1. Expression を評価し、その結果を e とする。
  2. *1: 式 E.toNext[] を評価し、その結果に対して get-reference-value を行い、その結果を改めて e とする。ただし、この評価において部分式 E の評価結果は e であるとする。
  3. e が正常終了でなければ、それを返す。
  4. e の値に対して to-boolean を実行し、その結果が false ならば TrailingElse を実行しその結果を返す。
  5. この ForStatement に VarKeyword が含まれていれば、変数宣言文 @var I = E.item; を評価し、その結果を v とする。この ForStatement に VarKeyword が含まれていなければ、式文 I = E.item; を評価し、その結果を v とする。ただし、この評価において部分式 I はこの ForStatement の Identifier とし、部分式 E の評価結果は e であるとする。
  6. v が正常終了でなければ、それを返す。
  7. InnerStatement を実行し、その結果を r とする。
  8. r が正常終了ならば、式 E.toNext[] の評価 (*1) に戻る。
  9. r が break 終了で、その移動先の Unicode 文字列が 0 文字の文字列ならば、[[初期の Void.void]] を返す。
  10. r が continue 終了で、その移動先の Unicode 文字列が次のどちらかの条件を満たせば、式 E.toNext[] の評価 (*1) に戻る:
  11. r を返す。

以下は for 文の例である:

@var sum = 0;
@for @var i: 1 ~ 10: {
   sum += i;
}

このコードは、以下のコードと同等の動作をする:

@var sum = 0;
@var e = 1 ~ 10;
@while e = e.toNext[]: {
   i = e.item;
   sum += i;
}

ただし、変数 e は架空の変数である。

跳躍文

Break 文

BreakStatement
BreakKeyword Identifier? EOS
BreakKeyword
@break KD

Identifier の無い BreakStatement の実行は、0 文字の Unicode 文字列 を移動先とする break 終了の結果を返す。

Identifier を含む BreakStatement の実行は、Identifier トークンを構成する Unicode 文字列を移動先とする break 終了の結果を返す。

Continue 文

ContinueStatement
ContinueKeyword Identifier? EOS
ContinueKeyword
@continue KD

Identifier の無い ContinueStatement の実行は、0 文字の Unicode 文字列 を移動先とする continue 終了の結果を返す。

Identifier を含む ContinueStatement の実行は、Identifier トークンを構成する Unicode 文字列を移動先とする continue 終了の結果を返す。

復帰文

ReturnStatement
ReturnKeyword Expression? EOS
ReturnKeyword
@return KD

復帰文は関数の実行を終了する。

ReturnStatement: ReturnKeyword EOS の実行は、 [[復帰: 初期の Void.void]] を返す。

ReturnStatement: ReturnKeyword Expression EOS の実行は次のように行う:

  1. Expression を評価し、その結果に対して get-reference-value を実行し、その結果を v とする。
  2. v が正常終了でなければそれを返す。
  3. [[復帰: v の値]] を返す。

投擲文

ThrowStatement
ThrowKeyword Expression EOS
ThrowKeyword
@throw KD

投擲文は、エラー終了の結果を発生する。

ThrowStatement: ThrowStatement Expression EOS の実行は次のように行う:

  1. Expression を評価し、その結果に対して get-reference-value を実行し、その結果を v とする。
  2. v が正常終了でなければそれを返す。
  3. [[エラー: v の値]] を返す。

Try 文

TryStatement
TryKeyword Colon InnerStatement &(Catch / Else / Finally) Catch? Else? Finally?
Catch
CatchKeyword VarKeyword? Identifier Colon InnerStatement
Finally
FinallyKeyword Colon InnerStatement
TryKeyword
@try KD
CatchKeyword
@catch KD
FinallyKeyword
@finally KD

Try 文は、実行中に発生したエラーに対する処理を行う。

TryStatement の実行は、次のように行う:

  1. InnerStatement を実行し、その結果を a とする。
  2. ar とする。
  3. a が正常終了であり、かつこの TryStatement に Else が存在すれば、 Else に含まれる InnerStatement を実行し、その結果を改めて r とする。
  4. a がエラー終了であり、かつこの TryStatement に Catch が存在すれば、次の動作を行う:
    1. この Catch に VarKeyword が含まれていれば、変数宣言文 @var I = E; を評価し、その結果を改めて r とする。この ForStatement に VarKeyword が含まれていなければ、式文 I = E; を評価し、その結果を改めて r とする。ただし、この評価において部分式 I はこの Catch に含まれる Identifier とし、部分式 E の評価結果は [[a の値]] であるとする。
    2. r が正常終了ならば、Catch に含まれる InnerStatement を実行し、その結果を改めて r とする。
  5. この TryStatement に Finally が存在すれば、Finally に含まれる InnerStatement を実行する。その結果が正常終了でなければ、それを返す。
  6. r を返す。
© 2006-2007 Magicant