モデルの文法

モデル

モデルは、拡張子.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行コメントは // で記述することができます
  • 複数行コメントは /* <コメント内容> */ で記述することができます