文法の枠組み

プログラムに書き込む字句には次の種類がある:

キーワード (予約語, keywords)

識別子 (Identifiers)

定数 (Constants)

文字列リテラル (String Literals)

区切り子 (Punctuators)

ソースファイルに書き込む文法は, 次の 6 種類に分類できる:

コメント (注釈文, Comments)

プリプロセッサ (前処理, Preprocessors)

宣言 (Declarations)

式 (Expressions)

文 (Statements)

関数の定義 (Function Definitions)

字句要素 (Lexical Elements)

キーワード, 予約語 (Keywords), コンパイラが翻訳作業上予め意味を持つ言葉:

auto  break  case  char  const  continue

default  do  double  else  enum  extern

float  for  goto  if  inline  int

u long register restrict return short signed

sizeof static struct switch typedef union

unsigned void volatile while _Bool _Complex

_Imaginary

識別子 (Identifiers) (大文字, 小文字を区別!!):

a-z  A-Z  0-9

定数 (Constants):

[文字定数]  [整数定数]  [浮動小数点定数]  [列挙定数]

文字列リテラル (String Literals):

ダブル・クォーテーションで挟まれた文字列

区切り子 (Punctuators):

/ # < > < > ( ) { } [ ] , . -> + - * ;  など

lexical.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#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 文字列リテラル内の各文字
  区切り子      : / * # <> () {} = ; ,
*/

lexical.c の実行結果は:

[cactus:~/code_c/c_tuts]% ./lexical
a is 0; m is 12; n is 65.

文法の構成要素

lexical2.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
/*
  Program: Lexical2.c
  Builld It: gcc -Wall -o Lexical2 Lexical2.c
*/ // コメント
#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; // 文 (return 文, main 関数の返却) 
}

宣言 (Declarations)

[宣言] とは識別子の解釈, 属性を指定するもので, 必ずセミコロンで閉じる:

const int a = 0;
register int m = 12;
int n = 65;

宣言は次から構成されている:

記憶域クラス指定子 (Storage Class Specifiers)

型修飾子 (Type Qualifiers)

型指定子 (Type Specifiers)

宣言子 (Declarators)

初期化子 (Initializers)

型指定子 (Type Specifiers)

型指定子 (Type Specifiers)

_images/type_spec1.png

宣言子 (Declarators)

識別子

ポインタ宣言子 (Pointer Declarators)

配列宣言子 (Array Declarators)

関数宣言子 (Function Declarators)

データの種類

_images/data_type1.png

派生型(オブジェクト型, 不完全型, 関数型):

オブジェクト型 (object type): オブジェクト (値を提示できる記憶域領域) を完全に記述する型.

不完全型 (incomplete type): そうでないオブジェクトを記述する型. 値を記憶するためのメモリ領域の大きさ, [サイズ]を確定するには不十分な情報をもつオブジェクトを記述する型. 定型的な例は void.

関数型 (function type): 関数を記述する型.