字句解析計算機科学における字句解析 (じくかいせき、英: lexical analysis) とは、ある言語で書かれた文について、その文字の並びを解析し、言語的に意味のある最小の単位(トークン)に分解する処理のこと[1]。 概要字句解析は、コンピュータを用いた自然言語処理でも、プログラミング言語のコンパイルでも行われる[1]。 自然言語の文であれ、プログラムのソースコードであれ、文というのは結局、文字や記号や約物類が多数並んだもの(文字列)であるが、字句解析はそれを、言語的に意味のある最小単位トークン(英: token(s))に分解する処理である。 文を解析してトークンに分解する作業を自動的に行うプログラムを字句解析器(英: lexical analyser)という。 具体例コンパイラの中の字句解析の例を挙げる。 たとえばソースコード中に、あらかじめ現在値や初期値を入れるためのpresentやinitialという変数が宣言された後に、次の1行があるとする。
これを字句解析すると次のようになる。
つまり「 文字と文字の間の空白(ブランク。スペース文字の1〜数個の並び)は、通常、字句解析の途中で除去する[3]。上の例では また、コンパイラの字句解析では、コメント文つまり「 もうひとつ、C言語での文の例を挙げる。
これは、次の表のようにトークン化される。
トークンは字句解析する段階では、プログラムの要素としての妥当性は必ずしも考慮されない。例えば上記の例で 一方、数リテラルの値が、そのプログラミング言語で扱えるいかなる型がサポートする範囲よりも大きい値が書かれている場合は、最初からエラーにすることもある。 字句解析器スキャナ一般に、文字列をなめるような処理をするものをスキャナという。字句解析の場合、文字列から、1個のトークンになるような部分文字列を切り出す部分をスキャナとして分けて考える場合がある。 スキャナはある種の有限状態機械にモデル化できる。その有限状態機械は、それが処理する任意のトークンに含まれる文字の考えられる並びに関するルールを元に生成される。ここでいうルールとは例えば、「整数」トークンは任意個の数字の並びである、といったようなものである。プログラミング言語では、一般に、空白でない先頭の文字の種類によって、そこから始まるトークンの種類が類推できるよう設計され、その後の文字の並びはそのトークンとして受理できない文字が出てくるまでひとまとめとして処理される(最長一致の規則)。言語によっては、規則がもっと複雑で、複数個の文字について戻るようなバックトラッキングが必要になることもある。 狭義の正規表現(詳細に言うと、いわゆる非欲張り量指定子が無い正規表現)による表現が面倒な字句規則の代表例に、C言語の「 コメントの例の場合は、手書きの解析器であればそこだけアドホックにちょっと先読みすれば簡単に済むが、こういったパターンが意外とあることも、手書きが選ばれる理由のひとつである。また、JavaのGenericsやC++のテンプレートなどの字句解析で「 トークナイザトークン化は、スキャナによって得られた部分文字列に、トークンの種別の情報を付け(この部分の仕事は、実際のところスキャナによって適合するルールが選ばれた時点でほとんど済んでいる)、その種類によっては、たとえば整数ならその整数値といったような意味値(英: semantic value)を与える処理である。部分文字列の列からトークンを構築するには、字句解析器には第二段階の評価器が必要であり、評価器は文字列に対して「値」を付与する。文字列と型を結びつけたものが適切にトークンを表し、構文解析器に入力できるものとなる。括弧などの一部のトークンは「値」を持たないので、評価器(関数)はそれらについては何も返さない。整数、識別子、文字列などを扱う評価器は非常に複雑になる。空白やコメントなどはそのまま捨ててしまうこともある。最終的に、#トークンの節に挙げた表のような形の情報を持った、トークン列が得られる。 字句解析器生成器字句解析器を自動的に作成するソフトウェアを字句解析器生成器(英: lexical analyser generator)という。 1975年にマイク・レスク(en:Mike Lesk)とエリック・シュミットにより字句解析器生成器Lex が開発され、POSIXにも採用された。Lexは、トークンの規則を正規表現で記述した文書をもとに、自動的に字句解析器を作る。入力がどの規則にもマッチしないようであればエラーとする。 1987年ころには、Lexを en:Vern Paxson が改良したFlex(英語版記事)がリリースされ、広く利用されるようになった。Linuxのディストリビューションの多くがFlexを標準採用している。 なおLex 系の生成器は表駆動型の手法を採用している。 1994年にはPeter Bumbulisが開発したre2c(英語版記事)がリリースされた。[4] re2cはFlexの2倍から3倍の速度で処理を行う字句解析器を生成すると言われている 2017年にはFrank-Rene Schaeferが開発したquexがリリースされた。[5] これも高速な字句解析器を生成する。 脚注
参考文献
外部リンク
|