TECS CDL で記述された式は、コンポーネント記述が解釈されるときに評価されます。

式を評価するのは、以下の場合です。

  • 初期化子
  • 呼び口配列、受け口配列の添数
  • 指定子 (size_is, count_is, string, id) の引数

関数引き数や構造体メンバの size_is, count_is, string で他のパラメータを参照している場合、定数として値が求まらないものについては、型の導出のみを行います。

以下の表は、式を構成する部分式と演算内容についてまとめたものです。 上から順に優先度の高い演算となります。

種類 構成 内容
基本式 識別子 定数、属性、関数の引数の参照
‘true’ ブール型の真
‘false’ ブール型の偽
整数リテラル 整数値
浮動小数リテラル 実数値
8進数リテラル 8進整数値
16進数リテラル 16進整数値
文字リテラル 文字列
文字列リテラルリスト 文字列 (分割記述)
‘(‘ 式 ‘)’
後置式 基本式 基本式
後置式 ‘![‘ 式 ‘]’ 配列参照
後置式 ‘.’ 識別子 構造体メンバ参照
後置式 ‘->’ 識別子 構造体メンバ参照(ポインタの場合)
単項式 後置式 後置式
‘&’ キャスト式 変数のアドレス
‘*’ キャスト式 ポインタの間接参照
‘+’ キャスト式 オペランドの値
‘-‘ キャスト式 オペランドの符号反転
‘~’ キャスト式 オペランドのビット単位の補数
‘!’ キャスト式 オペランドの論理否定
‘sizeof’ 単項式 オペランドのバイト数
‘sizeof’ ‘(‘ 型名 ‘)’ オペランドのバイト数
キャスト式 単項式 単項式
‘(‘ 型名 ‘)’ キャスト式 オペランドの型変換
乗除式 キャスト式 キャスト式
乗除式 ‘*’ キャスト式 乗算
乗除式 ‘/’ キャスト式 除算
乗除式 ‘%’ キャスト式 剰余
加減式 乗除式 乗除式
加減式 ‘+’ 乗除式 加算
加減式 ‘-‘ 乗除式 減算
シフト式 加減式 加減式
シフト式 ‘<<’ 加減式 ビット左シフト
シフト式 ‘>>’ 加減式 ビット右シフト
関係式 シフト式 シフト式
関係式 ‘<’ シフト式 比較(右辺が大きければ真)
関係式 ‘>’ シフト式 比較(左辺が大きければ真)
関係式 ‘<=’ シフト式 比較(右辺が大きいか等しければ真)
関係式 ‘>=’ シフト式 比較(左辺が大きいか等しければ真)
等価式 関係式 関係式
等価式 ‘==’ 関係式 比較(等しければ真)
等価式 ‘!=’ 関係式 比較(等しくなければ真)
and式 等価式 等価式
and式 ‘&’ 等価式 ビット単位の論理積
exor式 and式 and式
exor式 ‘^’ and式 ビット単位の排他的論理和
or式 exor式 exor式
or式 ‘|’ exor式 ビット単位の論理和
論理AND式 or式 or式
論理AND式 ’&&’ or式 論理積
論理OR式 論理AND式 論理AND式
論理OR式 ‘||’ 論理AND式 論理和
条件式 論理OR式 論理OR式
論理OR式 ‘?’ 式 ‘:’ 条件式 第1オペランドが真なら第2オペランド、偽なら第3オペランド
条件式 条件式
定数式 条件式 条件式

基本式における識別子

基本式における識別子は、以下のいずれかです。

  • 定数定義文により定義された定数
  • 式が関数仮引き数の size_is, count_is, string 指定子の引き数として用いられる場合、参照される他の仮引き数
  • 式が属性の size_is 指定子の引数として用いられる場合、参照される他の属性
  • 式が構造体メンバ変数の size_is, count_is, string 指定子の引数として用いられる場合、参照される他の構造体メンバ変数
  • 内部変数の初期化子

定数式の一部に C_EXP を用いることはできません。

【補足説明】C_EXP は単一の初期化子として用いるものであり、式の一部として用いることはできない。

文字列リテラルリスト

文字列リテラルリストは、1つ以上の文字列を並べたものです。 文字列リテラルリストに含まれる文字列は連結されて、一つの文字列リテラルとして扱われます。

【制限】整数については、無限精度により評価される。このため無符号整数と有符号整数との演算は、有符号で行われる。

【制限】型の格上げは暗黙的に行われるが、格下げは暗黙的に行われない。キャストが必要である。

【制限】文字列リテラルは、(char_t *) 以外の型にキャストできない

【制限】ブール型は、整数型にキャストしない限り、他の型との演算はできない

【制限】 後置式に関数呼び出しと後置インクリメント、デクリメント演算子がない

【制限】 前置式に前置インクリメント、デクリメント演算子がない

【制限】式にコンマ演算子がない

初期化子

初期化子は、定数式、集成型初期化子リストまたは C_EXP 初期化子です。 このいずれを取りうるかは、初期化される変数の型によります。

定数式は、整数型、浮動小数型、ブール型、ポインタ型を初期化することができます。ただし、size_is 指定されたポインタ型は定数式では初期化できません。

集成型初期化子

集成型初期化子は、’{‘, ‘}’ で囲まれた初期化子リストです。 集成型の初期化子は、構造体型、配列型、size_is 指定されたポインタ型を初期化することができます。

【参照実装における制限】size_is 指定された構造体へのポインタ型は初期化子を指定できない。結果として var にのみ用いることができる。

C_EXP 初期化子

C_EXP 初期化子は、初期化する変数が集成型(構造体型、配列型)でない場合に、初期化子として指定することができます。

C_EXP 初期化子は、文字列リテラルを引数に取ります。 引数の文字列リテラルは、ジェネレータの出力の C 言語初期化子として出力されります。 ヘッダファイルで define 定義される値を参照するために使用することが意図されています。

プラグイン引数

プラグイン引数は、文字列定数です。

プラグイン引数は、プラグインモジュールによって解釈されるため各プラグインの仕様に依存しますが、以下の仕様が基本です。

  • ‘=’ の左辺にパラメータ名、右辺に文字列を置く
  • 左辺のパラメータ名は、識別子である
  • つまりパラメータ名は、先頭文字はアルファベットか ‘_’ で、2文字目以降はアルファベット, ‘_’ または数字である
  • ‘,’ で区切ることにより、複数のパラメータをプラグイン引数として渡すことができる
  • 右辺文字列の前後の空白文字は取り除かれる(” で囲まれている場合を除く)
  • 右辺文字列中のダブルクォート’”’ は、バックスラッシュ’’ で エスケープする必要がある
  • 右辺文字列中にカンマ ‘,’ を含む場合には、右辺文字列全体を ‘”’ で囲む必要がある
  • 右辺文字列中にダブルクォート’”’ とカンマ ‘,’ を含む場合には、右辺文字列全体を ‘”’ で囲む必要がある
  • さらに右辺文字列中のダブルクォート’”’にカンマ ‘,’ が続く場合は、カンマ ‘,’ もバックスラッシュ ‘’ でエスケープする必要がある

【記述例】

“param0 = val str” … ‘=’ の左辺にパラメータ名、右辺に値の文字列 “param1 = val str, param2 = val str2” … ‘,’ で連結 “param3 = “val str, val str2”” … 右辺文字列が ‘,’ を含む場合 ” で囲む “param4 = C_EXP( “MAIN_PRIORITY” )” … 右辺文字列が ‘”’ を含む場合 “param5 = ” ”,” “” … 右辺文字列が ‘,’ と ‘”’ を含む場合 ’”,”’ と解釈