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