コンパイラが実際に解釈する文法は,次の通りです。
| /* Example 2.1 */ | コメント (注釈文) | /*と*/で挟まれた部分はコメントと解釈。C99 では C++ のように,//から改行まででも良いとなっている。[C99, 6.4.9] | 
| #include <stdio.h> | プリプロセッサ (前処理) | 区切り子 #で始まるのは「プリプロセッサ」と解釈。ここでは,printf関数が定義されているライブラリstdio.hの読み込み。printf関数を使うため。 | 
| int main(void) { } | 関数の定義 | main関数の定義 | 
| const int a = 0; | 宣言 | 変数 aの定義 | 
| register int m = 12; | 宣言 | 変数 mの定義 | 
| int n = 65; | 宣言 | 変数 nの定義 | 
| printf("a is %d; m is %d; n is %d.\n", a, m, n); | 文(式文) | printf関数の呼出し文。関数の呼出しは「式」。printf関数は第1変数に指定した文字列リテラル内の文字列を標準出力。第2変数のaの値が文字列リテラル内の1つ目の%d,第3変数mの値が2つ目の%d,第4変数のnの値が3つ目の%d部分に出力される。%dを「変換指定子」(conversion specifier)といい,この場合十進法(digit)での出力を意味する。 | 
| return 0; | 文( return文) | main関数の返却。main関数の従属変数の値(戻り値,返り値,返却値)を0に設定。 | 
この例より理解できることは,字句それぞれが独立しているというよりは,字句の組合せで文法が成り立っていることです。そして,ソースファイルに書き込む文法は,次から構成されていることが理解できます。
先ずは,宣言の概略からです。