| 1 | == 字句 == |
| 2 | |
| 3 | TECS CDL の字句には、以下のものがあります。 |
| 4 | |
| 5 | * キーワード |
| 6 | * 指定子キーワード |
| 7 | * 識別子 |
| 8 | * リテラル |
| 9 | * 型名 |
| 10 | * 記号 |
| 11 | |
| 12 | 字句の区切りとして 0 個以上または、1 個以上の空白文字を使用します。 |
| 13 | |
| 14 | 16 進数で 20 以下の文字コードは空白文字として扱われます。 |
| 15 | |
| 16 | TECS CDL の字句は1文字以上の空白文字によって区切られます。 |
| 17 | ただし、空白文字がなくても字句が決定できる場合には、この限りではありません。 |
| 18 | |
| 19 | 【制限】全角の空白文字は、空白文字とはみなされない。 |
| 20 | |
| 21 | === キーワード === |
| 22 | |
| 23 | 以下の語は、キーワードです。 |
| 24 | キーワードは、識別子として用いることができません。 |
| 25 | |
| 26 | {{{ |
| 27 | attr bool_t C_EXP call cell celltype char char_t composite |
| 28 | const Descriptor double64_t entry enum enum16 enum32 enum64 |
| 29 | enum8 factory FACTORY false float32_t generate import import_C |
| 30 | int int128_t int16_t int32_t int64_t int8_t long namespace |
| 31 | region require schar_t short signature signed struct true |
| 32 | typedef uchar_t uint128_t uint16_t uint32_t uint64_t uint8_t |
| 33 | unsigned var void volatile |
| 34 | }}} |
| 35 | |
| 36 | === 指定子キーワード === |
| 37 | |
| 38 | 以下の語は、指定子キーワードです。 |
| 39 | 指定子を記述可能な箇所においてのみキーワードとして扱われます。 |
| 40 | 従って、指定子キーワードを識別子として用いることができます。 |
| 41 | ただし、指定子キーワードとして扱われる箇所に現れる識別子としては用いることができません。 |
| 42 | 例えば size_is などの引数に現れる場合には、指定子キーワードとは異なる語を用いる必要があります。 |
| 43 | |
| 44 | {{{ |
| 45 | active allocator choice class context count_is deviate |
| 46 | omain dynamic id idx_is_id in in_through inline inout |
| 47 | linkunit node nullable omit oneway optional out |
| 48 | out_through prototype receive ref_desc send singleton |
| 49 | size_is string through to_through |
| 50 | }}} |
| 51 | |
| 52 | === 識別子 === |
| 53 | |
| 54 | 識別子は、アルファベットまたは '_' で始まり、アルファベット、数字または '_' の繰返しからなります。 |
| 55 | |
| 56 | TECS CDL において識別子の長さを規定しませんが、CDL 記述を C 言語に翻訳する際にネームスペース、セルタイプ名、セル名、呼び口名、受け口名が連結されるため、連結語の長さが C コンパイラの識別可能な長さを超えない配慮が必要になります。 |
| 57 | 今日の多くのコンパイラは 255 文字までの長さの識別子を識別可能です。少なくとも、この長さに収まるようにする必要があります。 |
| 58 | |
| 59 | === リテラル === |
| 60 | |
| 61 | リテラルには、以下のものがあります。 |
| 62 | |
| 63 | * 16進数リテラル (HEX_CONSTANT) |
| 64 | * 8進数リテラル (OCTAL_CONSTANT) |
| 65 | * 整数リテラル (INTEGER_CONSTANT) |
| 66 | * 浮動小数リテラル (FLOATING_CONSTANT) |
| 67 | * 文字列リテラル (STRING_LITERAL) |
| 68 | * 山括弧文字列リテラル (AB_STRING_LITERAL) |
| 69 | * 文字リテラル (CHARACTER_LITERAL) |
| 70 | |
| 71 | 【補足説明】上記の括弧内は、TECS ジェネレータの終端記号の名前である。 |
| 72 | |
| 73 | 16進数リテラル:: '0x' で始まり、0-9 および/または a-f, A-F の 1 個以上繰返しです。 |
| 74 | |
| 75 | 8進数リテラル:: '0' で始まり、0-7 の 1 個以上繰返しです。 |
| 76 | |
| 77 | 浮動小数リテラル:: 1-9 で始まり 0-9 の繰返し(整数部)に続いて '.'、続いて 0-9 の 0 個以上の繰返し(小数部)、さらに続いて 'e' または 'E' に続く、符号 '+' または '-' (省略化)、最後に 0-9 の 1個以上の繰返し('e' または 'E' 以降、ここまで指数部)です。 |
| 78 | 小数部、指数部は省略可能である。ただし、0 に続いて '.' が続く場合は、8進数リテラルに優先して浮動小数として扱われます。 |
| 79 | |
| 80 | 【補足説明】浮動小数リテラルは C 言語のそれよりも若干制限が強い。例えば ".1" は C 言語では正当な浮動小数であるが、TECS CDL においては浮動小数とはみなされない。 |
| 81 | |
| 82 | 整数リテラル:: 1-9 で始まり、0-9 の 0 個以上繰返し、または '0' です。 |
| 83 | |
| 84 | 文字列リテラル:: ダブルクオート '"' で囲まれた文字列です。 |
| 85 | |
| 86 | 文字列リテラルに、ダブルクオートを含めるためには、バックスラッシュ '\' を前置します。 |
| 87 | 文字列リテラルが改行文字を含む場合にも、行末に バックスラッシュ '\' を置きます。 |
| 88 | |
| 89 | C 言語においては、バックスラッシュを前置することで改行コードなどの制御コードを記述しますが TECS CDL においては解釈せず、バックスラッシュの削除も行いません。 |
| 90 | これは、文字列リテラルがそのまま C 言語へ渡されるためです。 |
| 91 | |
| 92 | ただし、factory または FACTORY の引数として与えられた場合には別に扱われます。以下は、制御文字コードに置換されます。 |
| 93 | * "\n" … 改行コード |
| 94 | * "\r" … 復帰コード |
| 95 | * "\f" … フィードコード |
| 96 | * "\t" … TAB コード |
| 97 | これ以外に、バックスラッシュが前置されている場合、バックスラッシュは取り除かれ、それに続く文字は無条件に文字列の一部として扱われます。 |
| 98 | |
| 99 | 【参照実装における制限】漢字を扱うための文字コードは SJIS, EUC, UTF8 を用いることができる。ただし SJIS を用いる場合には、C コンパイラが SJIS を扱えるものを用いなくてはならない。SJIS の文字コードには、第二バイトに |
| 100 | 0x5c ('\', バックスラッシュ) |
| 101 | を含むものがある。SJIS を扱えない C コンパイラでは、第2バイトの 0x5c をエスケープ文字として扱ってしまう。 |
| 102 | |
| 103 | |
| 104 | 山括弧文字列リテラル:: 山括弧 '<', '>' で囲まれた文字列です。 |
| 105 | この文字列には、アルファベットの大文字、小文字、'_', '.', ' ' (空白文字) のみを用いることができます。 |
| 106 | |
| 107 | 文字リテラル:: シングルクオートで囲まれた一文字です。 |
| 108 | 文字リテラルは、その文字コードの整数として扱われます。 |
| 109 | バックスラッシュを前置することで、バックスラッシュに続くもう一文字を文字リテラルの一部として扱われます。 |
| 110 | |
| 111 | 【参照実装における制限】多バイト文字を一文字として扱うことができる。ただし、C コンパイラが多バイト文字を、文字定数として扱うことができる必要がある。ポータビリティの観点からは、用いることは好ましくない。 |
| 112 | |
| 113 | === 型名 === |
| 114 | |
| 115 | typedef により定義される型名は、識別子と同じです。 |
| 116 | |
| 117 | ただし、typedef により定義されて以降は、「型名」として扱われ識別子とは区別されます。 |
| 118 | このため typedef により型名として定義された識別子は、変数名、関数名の識別子としては用いることができません。 |
| 119 | |
| 120 | 【参照実装における制限】型名を識別子とは別のリテラルとして扱うのは、実装上の理由による。 |
| 121 | |
| 122 | === コメント === |
| 123 | |
| 124 | コメントとして記述された文字列は、TECS CDL の記述として解釈されません。 |
| 125 | コメントの文字列は、以下の2通りの方法で記述できます。 |
| 126 | |
| 127 | * '/*', '*/' で囲んだ文字列 |
| 128 | * '!//' から行末までの文字列 |
| 129 | |
| 130 | '/*' と '*/' の間には、改行文字を含むことができる。しかし、入れ子にすることはできません。 |
| 131 | |
| 132 | |
| 133 | [wiki:CDLref トップページ]・[wiki:CDLref_index 目次] |