式
TECS CDL で記述された式は、コンポーネント記述が解釈されるときに評価されます。
式を評価するのは、以下の場合です。
- 初期化子
- 呼び口配列、受け口配列の添数
- 指定子 (size_is, count_is, string, id) の引数
関数引き数や構造体メンバの size_is, count_is, string で他のパラメータを参照している場合、定数として値が求まらないものについては、型の導出のみを行います。
以下の表は、式を構成する部分式と演算内容についてまとめたものです。 上から順に優先度の高い演算となります。
|
|
|
---|---|---|
| ||
識別子 | 定数、属性、関数の引数の参照 | |
'true' | ブール型の真 | |
'false' | ブール型の偽 | |
整数リテラル | 整数値 | |
浮動小数リテラル | 実数値 | |
8進数リテラル | 8進整数値 | |
16進数リテラル | 16進整数値 | |
文字リテラル | 文字列 | |
文字列リテラルリスト | 文字列 (分割記述) | |
'(' 式 ')' | 式 | |
| ||
基本式 | 基本式 | |
後置式 '[' 式 ']' | 配列参照 | |
後置式 '.' 識別子 | 構造体メンバ参照 | |
後置式 '->' 識別子 | 構造体メンバ参照(ポインタの場合) | |
| ||
後置式 | 後置式 | |
'&' キャスト式 | 変数のアドレス | |
'*' キャスト式 | ポインタの間接参照 | |
'+' キャスト式 | オペランドの値 | |
'-' キャスト式 | オペランドの符号反転 | |
'~' キャスト式 | オペランドのビット単位の補数 | |
'!' キャスト式 | オペランドの論理否定 | |
'sizeof' 単項式 | オペランドのバイト数 | |
'sizeof' '(' 型名 ')' | オペランドのバイト数 | |
| ||
単項式 | 単項式 | |
'(' 型名 ')' キャスト式 | オペランドの型変換 | |
| ||
キャスト式 | キャスト式 | |
乗除式 '*' キャスト式 | 乗算 | |
乗除式 '/' キャスト式 | 除算 | |
乗除式 '%' キャスト式 | 剰余 | |
| ||
乗除式 | 乗除式 | |
加減式 '+' 乗除式 | 加算 | |
加減式 '-' 乗除式 | 減算 | |
| ||
加減式 | 加減式 | |
シフト式 '<<' 加減式 | ビット左シフト | |
シフト式 '>>' 加減式 | ビット右シフト | |
| ||
シフト式 | シフト式 | |
関係式 '<' シフト式 | 比較(右辺が大きければ真) | |
関係式 '>' シフト式 | 比較(左辺が大きければ真) | |
関係式 '<=' シフト式 | 比較(右辺が大きいか等しければ真) | |
関係式 '>=' シフト式 | 比較(左辺が大きいか等しければ真) | |
| ||
関係式 | 関係式 | |
等価式 '==' 関係式 | 比較(等しければ真) | |
等価式 '!=' 関係式 | 比較(等しくなければ真) | |
| ||
等価式 | 等価式 | |
and式 '&' 等価式 | ビット単位の論理積 | |
| ||
and式 | and式 | |
exor式 '' and式 | ビット単位の排他的論理和 | |
| ||
exor式 | exor式 | |
or式 '|' exor式 | ビット単位の論理和 | |
| ||
or式 | or式 | |
論理AND式 '&&' 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 = \" \"\,\" \"" … 右辺文字列が ',' と '"' を含む場合 '","' と解釈