字句
字句(じく)とは、プログラミング言語などにおいてソースコードに出現する文字列の中で意味を持つ最小単位であり、トークン(英: token)とも言う。
詳細は言語によって異なるが、一般的には、以下のようなトークンがある。
if
やint
などのキーワード(あるいは予約語)main
やargc
などといった関数(サブルーチン)名や変数名などの識別子{
}
(
)
[
]
などの括弧類(の片方ずつ)+
-
*
/
=
>
<
&
|
などの演算子[注釈 1],
.
:
;
などの区切り文字3.14159
や"hello"
のようなリテラル
括弧類や区切り文字が出現位置によっては演算子となる言語もある。
多くの場合、プログラミング言語の構文規則はトークン列を定義しており[2]、構文解析の前に、まずトークンを切り出し、必要であれば種類別に分類したりもする。この処理を字句解析と呼ぶ。この処理のため、プログラミング言語の言語仕様では、それぞれの種類のトークンはどのような文字から構成されるかが規定されている。
(例)識別子は、英字で始まり、その後に0個以上の英字、数字または下線 (_
) が続く。ただしキーワード(あるいは予約語)と同じ綴りでないこと。
一般に構文規則はその文脈自由文法が(バッカス・ナウア記法で)示されることが多いのに対し、字句規則は正規表現で示されることが多い。上の例を正規表現で表すと [A-Za-z][0-9A-Z_a-z]*
となる。ここで、「キーワード(あるいは予約語)と同じ綴りでないこと」という制限は、この表現には含まれない。プログラミング言語における規則には、一般にそういった制限が多いが、それを正規表現で表現するのは難しい(長大になる)ことも多い。キーワードの規則と識別子の規則はよく似たものであることも多く、いったんキーワードと識別子を同じ規則で処理しておき、その後に出現位置などの文脈に応じて分類し直すほうが効率的でもある。拡張性や後方互換性の観点から、通常は識別子として利用することもできるが、特定の出現位置ではキーワードの役割を果たすような「文脈依存キーワード」(contextual keyword, keyword in context, context-sensitive keyword) をサポートする言語も多い[3][4]。