プログラムに書き込む各字句(トークン)の概略です。[C99, 6.4]
コンパイラが翻訳作業上予め意味をもつ言葉。
| auto | break | case | char | const | continue | 
| default | do | double | else | enum | extern | 
| float | for | goto | if | inline | int | 
| long | register  | restrict | return  | short | signed | 
| sizeof | static | struct | switch | typedef  | union | 
| unsigned   | void | volatile  | while | _Bool | _Complex | 
| _Imaginary | |||||
英数字 a-zA-Z0-9 とアンダースコア _ からなる文字列。大文字小文字を区別。変数名や関数名などのこと。
数字や文字などで決まった値として認識するもの。「文字定数」「整数定数」「浮動小数点定数」「列挙定数」がある。
ダブル・クォーテーションで挟まれた文字列。
上とは独立な意味をもつ文字。/ # < > ( ) { } [ ] , .  -> + - * ; など。
次を一つのソースファイルに書き込み,そのソースファイルのみから構成されるプログラムを考えましょう。ソースファイル名は任意ですが,拡張子 .c を必ず付します。
/* Example 2.1 */
#include <stdio.h>
int main(void)
{
       const int a = 0;
       register int m = 12;
       int n = 65;
       printf("a is %d; m is %d; n is %d.\n", a, m, n);
       return 0;
}
このプログラムでの各字句です。
| ・キーワード | int void const register return | 
| ・識別子 | main a m n printf | 
| ・文字列リテラル | "a is %d; m is %d; n is %d.\n" | 
| ・定数 | 0 12 65 文字列リテラル内の各文字 | 
| ・区切り子 | / * # <> () {} = ; , | 
しかしながら,文法自体は,これらの組合せでできています。