めげない、めげない。
/*
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 件のコメント:
コメントを投稿