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 = " "," "" … 右辺文字列が ',' と '"' を含む場合 '","' と解釈