2009年2月22日日曜日

【C:ARM5】2 字句要素

うーん。字句について理解するだけで結構時間がかかった。。。
めげない、めげない。

/*

2 字句要素 (Lexical Elements)

- "This chapter describes the lexical structure
of the C language--that is, the characters that
may appear in a C source file and how they are
collected into lexical units, or tokens."


2.1 文字集合 (Character Set)

- ソース文字集合(source character set)というとき、
それはいわゆる文字集合そのままであり、エスケープ
表記等は含んでいないことに注意。

- ここでは文字コードは指定していない。文字集合の指
定である。

- 基本的にはISO/IEC 10646のBasic Latinブロックだよ。

- 国によってはその国の文字集合にBasic Latinの中の
文字が含まれていないこともある。そこでCには
ISO/IEC 646-1083のInvariant Code Setだけで書ける
ように、漏れた記号をInvariant code setの文字で表
現する仕組みがあるよ。

2.1.1 実行時文字集合 (Execution Character Set)

- クロスコンパイルを考えよ。ソースをコンパイルする
ときの環境の文字集合とプログラムが実行される環境
の文字集合は必ずしも同じではない。

- 実行時文字集合(execution character set)はバック
スラッシュによるエスケープ表記も含む。

- ソースをコンパイルするときの環境と実行するときの
環境が同じなら、ソース文字集合と実行時文字集合は
同じになる。

2.1.2 空白類文字と行の終わり (Whitespace and Line Termination)

- 空白類文字は隣り合う字句を分離する働きを持つ。

- 論理ソース行の例。gccでコンパイルできた。
*/

int main(void)
{
if (1==2) 1; el\
se 2;
return (0);
}

/*

2.1.3 文字コード (Character Encoding)

- (実行時)文字集合に含まれる各文字には何らかの慣用
的な数値表現が割り当てられている。これを文字コー
ドと呼ぶ。

- Cでは文字コードについていくつかの制約は課すが、
細かな指定はしない。

2.1.4 3文字表記 (Trigraphs)

- ISO 646-1083 Invariant Code Set に含まれる文字だ
けでCプログラムを書くための仕組み。

- 3文字表記(trigraphs)の処理は、字句解析の前に実施
される。かなり先頭の作業。

- 3文字表記の例。gccでは-trigraphsオプションが必要。
*/

int main(void)
??<
return (0);
??>

/*

2.1.5 多バイト文字とワイド文字 (Multibyte and Wide Characters)

- 非英語アルファベットに対応するためにワイド文字
とワイド文字列がある。

- ワイド文字とは、拡張文字集合(extended
character set)の要素のバイナリ表現である。

- 規格Cではワイド文字のためのwint_t型とwchar_t型
がある。

- ワイド文字は16ビットを占めるのが普通である。

- ナルワイド文字以外は、規格Cは拡張文字集合につい
て規程していない。

- ファイル等の外部メディアやCソースプログラムは、
大抵のところバイトの多きさの文字で構成されてい
る(バイト指向)。

- そのため多バイトコードという仕組みが使われる。
多バイトコードとは、バイトの大きさの文字の並び
とワイド文字の並びとの間でロケール固有の写像を
行う方法。

- 1つのワイド文字を、ソース文字集合または実行時文
字集合に含まれる文字(の並び)によって表現したの
が多バイト文字である。

- 多バイト文字は通常のC文字列である。

- 多バイト文字の形式や、多バイト文字とワイド文字
の写像は処理系定義である。

- 多バイト文字の方式には、状態依存型と状態独立型
がある。

- 規格Cは多バイト文字についていくつかの制約を課し
ている。

- 多バイト文字は次の場所で使ってよい。
- 注釈
- 識別子
- ヘッダ名
- 文字列定数
- 文字定数

- 「ソースの物理的表現の中の多バイト文字は、字句
解析、プリプロセス処理、それどころか継続行の接
合よりも前に認識され、ソース文字集合に翻訳され
なければならない。」 う、これわからない。。。

2.2 注釈 (Comments)

- お、Cでも//って使えるんだ。試すと、、、使えた。
*/

// Program to compute the squares of
// the first 10 integers
#include <stdio.h>
void Squares( /* no arguments */)
{
int i;
/*
Loop from 1 to 10,
printing out the squares
*/
for (i=1; i<=10; i++)
printf("%d //squared// is %d\n",i,i*i);
}

int main(void)
{
Squares();
return (0);
}

/*

2.3 字句 (Tokens)

- やっとTokenだ。。。

- 「Cプログラムを構成する文字は、以下に述べる規則
に従って集められて字句となる」うーん。名文だ。

- 字句は5種類。
- 演算子
- 分離子
- 識別子
- キーワード
- 定数

- 「コンパイラは左から右に文字を集めるとき、できる
だけ長い字句を作ろうとする。」

2.4 演算子と分離子 (Operators and Separators)

- 単純演算子
! % ^ など
- 複合代入演算子
+= -= など
- その他の複合演算子
-> ++ など
- 分離子
( ) [ ] など
- 代替綴り
<% %> <: :> など

2.5 識別子 (Identifiers)

- 識別子(名前)はラテン大文字と小文字、数字、アンダ
スコア、国際文字名および処理系定義の多バイト文字
の並びである。ということはgccでUTF-8の日本語も使
えるかも? 試す。
*/

#include <stdio.h>
int main(void)
{
int あ;
for (あ=1;あ<10;あ++)
printf("%d ", あ);

return (0);
}

/*

- これは駄目。-std=c99しても駄目。

- \uでいく。

*/

#include <stdio.h>
int main(void)
{
int \u3041; // あ
for (\u3041=1;\u3041<10;\u3041++)
printf("%d ", \u3041);

return (0);
}

/*

- おお。これは-std=c99ならOK。gccが多バイトからソー
ス文字集合への変換をしてくれないんだなきっと。

- 識別子の文字数の制限には注意が必要。特にリンカな
どの外部のプログラムに露出する場合は、そっちの制
限もあるから。

2.6 キーワード (Keywords)

- 識別子の一部は規格にてキーワードとして定められて
おり、普通の識別子として使ってはいけない。

- キーワードの一覧

auto _Bool break case char _Complex const
continue default do double else enum extern
float for goto if _Imaginary inline int long
register restrict return short signed sizeof
static struct switch typedef union unsigned
void volatile while

2.6.1 既定義識別子 (Predifined Identifiers)

- __func__は既定義識別子であり、プログラマが定義し
てはならない。


2.7 定数 (Constants)

- 別の言語ではリテラルとも言う。Cでは伝統的に
Constantsと呼ぶ。

- この節、型の概念とクロスリファレンスになっている
なぁ。まあしょうがないんだろうな。

2.7.1 整数定数 (Integer Constants)

- まあ、ごちゃごちゃと。割愛。

2.7.2 浮動小数点定数 (Floating-Point Constants)

- これも割愛。

2.7.3 文字定数 (Character Constants)

- 文字定数は、一つ以上の文字をアポストロフィで囲んで書く。

- 文字定数の前にLをつけるとワイド文字定数になる。

- 形式は次のとおり。

文字定数:
' c文字の並び '
L' c文字の並び '

c文字の並び:
c文字
c文字の並び c文字

c文字:
「'、 \ および改行を除く任意のソース文字集合の文字」
エスケープ表記
国際文字名

- 先頭にLを付けない文字定数はint型である。その値は、
実行時文字集合におけるその文字のコードである。

- Lで始まる文字定数はwchar_t型である。ワイド文字定
数は複数の文字と複数のエスケープ表記の並びとなっ
ていて、それらがひとつとなって多バイト文字を表す
のが普通。多バイト文字からから対応するワイド文字
への写像は処理系定義である。その変換を実行時に行
うのはmbtowc関数である。

- 複数文字定数の意味は処理系定義である。

2.7.4 文字列定数 (String Constants)

- 形式は次のとおり。

文字定数:
" s文字の並び "
L" s文字の並び "

s文字の並び:
s文字
s文字の並び s文字

s文字:
「"、 \ および改行を除く任意のソース文字集合の文字」
エスケープ表記
国際文字名

- n文字を含む文字列定数の型はchar [n+1]である。最
後はナル文字'\0'である。

- n文字を含むワイド文字列定数の型はwchar_t [n+1]で
ある。最後はナルワイド文字である。

- 文字列定数の文字を保持しているメモリの内容を書き
換えようとしてはいけない。

2.7.5 エスケープ表記 (Escape Characters)

- 割愛。

2.7.6 文字エスケープコード (Character Escape Codes)

- 割愛。

2.7.7 数値エスケープコード (Numeric Escape Codes)

- 割愛。

2.8 C++との互換性 (C++ Compatibility)

- 割愛。

2.9 文字集合、レパートリおよびコードについて (On Character sets, Repertories and Encodings)

- 国際文字名 (Universal Character Names)は、文字定
数、文字列定数および識別子の中に任意のUCS-2文字
またはUCS-4文字を書く書き方である。
- コードはISO/IEC 10646に従う。

2.10 練習問題 (Execises)

- 割愛。

*/

Cでの日本語の取り扱いを多少理解できた。

こつこつ。

0 件のコメント: