モデルの文法¶
モデル¶
モデルは、拡張子.modelのファイル(モデルファイルという)から読み込まれます。
複数のモデルファイルを読み込むことができます。
- モデルファイルは、0個以上の計算クラスの記述で表されます
- モデル内に同じ名前を持つ計算クラスがある場合にはエラーとなります
計算クラス¶
計算クラスは、calculation <計算クラス名> <継承> { <計算クラスの内容> }
で記述します。
- 計算クラス名は、 識別子として有効な文字列 でなくてはいけません
- 計算クラスの内容は、0個以上のモジュールの記述で表されます
- 継承は、継承を行う場合のみ
(<継承元の計算クラス名>)
と記述します。 - 計算クラス内に同じ名前をもつモジュールがある場合エラーとなります
NotImplemented
の算式文を含む場合、calculation
の前にabstract
を付ける必要があります。abstract
をつけた場合、継承されずに計算クラスとして使用することができません。
モジュール¶
モジュールは、 module <モジュール名> { <モジュールの内容> }
で記述することができます。
- モジュール名は、 識別子として有効な文字列 でなくてはいけません
- モジュールの内容は、0個以上のモジュールパラメータ・変数・関数・埋め込み関数で構成されます
- モジュールパラメータ名や変数・関数・埋め込み関数名に重複がある場合エラーとなります
モジュールパラメータ¶
モジュールパラメータは、以下のいずれかで記述することができます。
@range = <識別子>
@range_last = <算式文(int型)>
@range_last
には算式を設定することができますが、以下の制約があります- 同じモジュールの変数・関数を参照できない
- シナリオやショックに依存してはいけない
変数¶
変数は、<型> <変数名> = <算式文>
として記述されます。
変数名は、 識別子として有効な文字列 でなくてはいけません
型は、スカラー値もしくは配列の 型 のいずれかとなります
型が配列型の場合、その範囲はそのモジュールのタイムステップの範囲で定められます。 また、算式文にはタイムステップを用いることができ、配列の各要素が各タイムステップに対して計算されます。
- 返り値の型が配列型となる関数を使った場合は、配列の各要素は関数により直接計算されます
関数¶
関数は、
<型> <関数名> (<引数リスト>) = <算式文>
として記述されます。引数リストは、
<型> <引数名>
をカンマでつないだものとなります。- 変数名・引数名は、 識別子として有効な文字列 でなくてはいけません
- 型は、スカラー値もしくは配列の 型 のいずれかとなります
- 関数ではタイムステップを用いることができません
埋め込み関数¶
埋め込み関数は、
<型> <関数名> (<引数リスト>) = {* <C#コード記述> *}
として記述されます。引数リストは、
<型> <引数名>
をカンマでつないだものとなります。- 複雑なロジックを表現する場合の上級者向け機能です
算式文¶
算式文には、単純な式を表す 式文 と、条件分岐を表す IF文 、定義を行わないことを表す NotImplemented文 があります。
式文
<式>
IF文
if (<式(bool型)>) { <算式文> } elseif (<式(bool型)>) { <算式文> } else { <算式文> }
- elseifはなくても、複数あっても構いません
NotImplmented文
NotImplemented
- NotImplmented文は変数や関数の直下に記述する必要があります
式¶
式は、識別子参照・特殊参照・リテラルおよびそれらに演算子・関数・括弧を適用したものです
- 式は型を持ちます。計算過程で型がマッチしない場合はエラーとなります。
識別子参照¶
識別子参照は、以下の種類に分かれます。
- 変数の参照
<変数名>
または<モジュール名>.<変数名>
で記述します。参照する変数が配列のとき、配列の何番目の値を参照するかを(<インデックス>)
でその後に指定します。- 関数の参照(埋め込み関数やユーティリティ関数を含む)
<関数名>
または<モジュール名>.<関数名>
で記述します。その関数に合った引数を(<引数のリスト>)
でその後に指定する必要があります。- タイムステップ
- @rangeで指定した文字列(例:x, tなど)で記述します
- 関数の引数
- 関数の内部にある式の場合、その関数の引数で記述します
特殊参照¶
シナリオ・ショック・インフォースを参照したいときは、
$scenario
$shock
$inforce
と記述することで、それらの番号がint型で設定されます。
リテラル¶
- 整数は、
0
,123
,10000
などと記述することでint型で設定されます。 - 小数は、
0.0
,1.2
,1000.0
,3333.3
などと記述することでdouble型で設定されます。 - 文字列は、
"a"
,"abc"
,"hello"
などと記述することでstring型で設定されます。 - 論理値は、
true
,false
と記述することでbool型で設定されます。
コメント¶
- 1行コメントは
//
で記述することができます - 複数行コメントは
/* <コメント内容> */
で記述することができます