字句

どのようなプログラミング言語にも、字句(トークン)と呼ばれる、これ以上分解することが出来ない単位を持ちます。これは、英文における単語と同じようなものです。コンパイラは、最初にソースコードのテキストを、字句単位に分解します。よって、字句を理解することで、より深くプログラミング言語の世界を知ることができます。

英文における "I am a cat" は、4つの単語に分解できます。「私」を意味する代名詞"I"、be 動詞の "am"、冠詞 "a"、「猫」を意味する名詞"cat"です。これらの単語はスペースで区切られ、文法上の機能に種別された品詞に分けられます。

プログラミング言語は、私たちが使う言葉とは異なりますが、コードを字句に分解することができ、字句には品詞と同じような文法上の型が割り当てられているという点では似ています。初心者が書いたコードのエラーの多くは、文法の誤りによるものです。コンパイルできない場合は、一度、頭の中でコードを字句単位に分解し、個々の字句が適切かどうかを辿れば、問題を発見できるでしょう。

字句は、空白や改行、タブなどのホワイトスペースによって区切られます。C言語では、字句の並びさえ適切であれば、ホワイトスペースは自由に使えます。例えば、main()関数を次のように宣言しても、構文上の問題はありません。

int
main(void) { ... }

字句は、スペースの他に改行やタブでも区切ることができます。よって、main()関数の宣言で、戻り値型を表すintの直後に開業し、その後に関数名 mainを指定しても問題はありません。ただし、mai nのように、キーワードや名前の途中でスペースを入れてしまうと、字句が区切られて別の意味になってしまいます。mai n であれば、mai と n という 2つの字句に分けられますが、構文上、不正な字句となってしまうでしょう。

分解された字句は、品詞のような文法上の特性に分類できます。

  • キーワード
  • 識別子
  • 定数
  • 文字列リテラル
  • 演算子
  • 区切り子

キーワードとは、C言語が言語仕様で定めている予約された特別な単語を表します。intやvoid、returnなどは、キーワードに該当します。キーワードは、最初から特別な意味を持ちます。

識別子は、開発者が何らかの要素を識別するために自由に命名できる名前を表します。mainやprintfなどは、関数を表す識別子です。識別子は、他の識別子と衝突してはなりません。同じ名前の関数を、複数作ることはできません。また、キーワードと同じ名前を使うこともできません。

定数とは、10や100のような、変化しない固定された値を表します。ソースコード上に直接記載された値は、定数となります。returnで関数の戻り値として返していた値0が定数に該当します。

文字列リテラルとは、二重引用符 " で囲まれた文字の列を表します。printf()関数に渡していたパラメータが文字列に該当します。