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