プログラミング言語

文法

プログラミング言語の見た目は、その構文(統語論)で決定される。多くのプログラミング言語は文字だけで構成され、単語や数や区切り記号の並びであり、自然言語に似ている。一方で、グラフィカルなプログラミング言語もあり、プログラムをグラフィカルなシンボル間の関係で表す。言語の構文は、構文的に正しいプログラムを形成するシンボルの組合せを規定するものである。シンボルの組合せの意味は意味論で与えられる。多くの言語は文字で構成されるため、以下ではそれについて論じる。プログラミング言語の構文は一般に、字句解析用の正規表現構文解析用のバッカス・ナウア記法文脈自由文法)で定義される。下記はLISPに関する単純な構文である。 expression ::= atom | list
atom ::= number | symbol
number ::= [+-]?['0'-'9']+
symbol ::= ['A'-'Z''a'-'z'].*
list ::= '(' expression* ')'
この構文は次のような意味である。 これに従うトークン列の例として、'12345'、'()'、'(a b c232 (1))' などがある。構文上正しいプログラムが全て意味論的にも正しいとは限らない。つまり、プログラミング言語の文法は、構文と意味論の両方がそろって成立する。また、構文的にも意味論的にも正しいプログラムだとしても、それを書いた人の意図を正しく反映していない場合もある。自然言語を例にすると、文法的に正しい文に「偽」となるような意味を与えることもできる。 以下のC言語のコード断片は構文上は正しいが、意味論的には正しくない(pヌルポインタなので、p->realp->im には意味がない)。
complex *p = NULL;
complex abs_p = sqrt (p->real * p->real + p->im * p->im);
プログラミング言語の文法はチョムスキー階層内で分類可能である。多くの言語の構文は文脈自由文法を使って記述される(※ Michael Sipser 1997年 Introduction to the Theory of Computation PWS Publishing ISBN 0-534-94728-X Section 2.2: Pushdown Automata, pp.101–114.)。

戻る