(Translated by https://www.hiragana.jp/)
字句解析 - Wikipedia コンテンツにスキップ

字句じく解析かいせき

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』

計算けいさん科学かがくにおける字句じく解析かいせき (じくかいせき、えい: lexical analysis) とは、ある言語げんごかれたぶんについて、その文字もじならびを解析かいせきし、言語げんごてき意味いみのある最小さいしょう単位たんい(トークン)に分解ぶんかいする処理しょりのこと[1]

概要がいよう

[編集へんしゅう]

字句じく解析かいせきは、コンピュータをもちいた自然しぜん言語げんご処理しょりでも、プログラミング言語げんごコンパイルでもおこなわれる[1]

自然しぜん言語げんごぶんであれ、プログラムのソースコードであれ、ぶんというのは結局けっきょく文字もじ記号きごうやくものるい多数たすうならんだもの(文字もじれつ)であるが、字句じく解析かいせきはそれを、言語げんごてき意味いみのある最小さいしょう単位たんいトークン(えい: token(s))に分解ぶんかいする処理しょりである。

ぶん解析かいせきしてトークンに分解ぶんかいする作業さぎょう自動的じどうてきおこなうプログラムを字句じく解析かいせきえい: lexical analyser)という。

具体ぐたいれい

[編集へんしゅう]

コンパイラのなか字句じく解析かいせきれいげる。

たとえばソースコードなかに、あらかじめ現在げんざい初期しょきれるためのpresentやinitialという変数へんすう宣言せんげんされたのちに、つぎの1ぎょうがあるとする。

present := initial + 15 [2]

これを字句じく解析かいせきするとつぎのようになる。

文字もじれつ かた
present 識別子しきべつし
:= 代入だいにゅう演算えんざん
initial 識別子しきべつし
+ 演算えんざん
15 かず

つまり「present」や「initial」という変数へんすうめい、「:=」という変数へんすうへの代入だいにゅうしめ演算えんざん、「15」という数字すうじれつは、意味いみ最小さいしょう単位たんい(トークン)である。

文字もじ文字もじあいだ空白くうはく(ブランク。スペース文字もじの1〜数個すうこならび)は、通常つうじょう字句じく解析かいせき途中とちゅう除去じょきょする[3]うえれいでは present:=あいだやそのうしろなどにある空白くうはく文字もじ除去じょきょされている。空白くうはく文字もじはトークンとトークンを分離ぶんりする役割やくわりくらいしかないものなのでトークンにはふくめない。

また、コンパイラの字句じく解析かいせきでは、コメントぶんつまり「/* 現在げんざい計算けいさんするためのプログラム。 */」といったようなぶんは、処理しょり最初さいしょ段階だんかいでひとつのカタマリとしてあつかい、まるごと除去じょきょしてしまうこともある。

もうひとつ、C言語げんごでのぶんれいげる。

sum = 35 + 21;

これは、つぎひょうのようにトークンされる。

文字もじれつ かた
sum 識別子しきべつし
= 代入だいにゅう演算えんざん
35 かず
+ 加算かさん演算えんざん
21 かず
; セミコロン

トークンは字句じく解析かいせきする段階だんかいでは、プログラムの要素ようそとしての妥当だとうせいかならずしも考慮こうりょされない。たとえば上記じょうきれいsum は、もしこのぶんまえにsumが宣言せんげんされていなければ意味いみがないが、字句じく解析かいせき通常つうじょうトークンとしては問題もんだいないとしてあつかう。

一方いっぽうかずリテラルのが、そのプログラミング言語げんごあつかえるいかなるかたがサポートする範囲はんいよりもおおきいかれている場合ばあいは、最初さいしょからエラーにすることもある。

[注釈ちゅうしゃく 1]

字句じく解析かいせき

[編集へんしゅう]

スキャナ

[編集へんしゅう]

一般いっぱんに、文字もじれつをなめるような処理しょりをするものをスキャナという。字句じく解析かいせき場合ばあい文字もじれつから、1個いっこのトークンになるような部分ぶぶん文字もじれつ部分ぶぶんをスキャナとしてけてかんがえる場合ばあいがある。

スキャナはあるしゅ有限ゆうげん状態じょうたい機械きかいにモデルできる。その有限ゆうげん状態じょうたい機械きかいは、それが処理しょりする任意にんいのトークンにふくまれる文字もじかんがえられるならびにかんするルールをもと生成せいせいされる。ここでいうルールとはたとえば、「整数せいすう」トークンは任意にんい数字すうじならびである、といったようなものである。プログラミング言語げんごでは、一般いっぱんに、空白くうはくでない先頭せんとう文字もじ種類しゅるいによって、そこからはじまるトークンの種類しゅるい類推るいすいできるよう設計せっけいされ、その文字もじならびはそのトークンとして受理じゅりできない文字もじてくるまでひとまとめとして処理しょりされる(最長さいちょう一致いっち規則きそく)。言語げんごによっては、規則きそくがもっと複雑ふくざつで、複数個ふくすうこ文字もじについてもどるようなバックトラッキング必要ひつようになることもある。

狭義きょうぎ正規せいき表現ひょうげん詳細しょうさいうと、いわゆる欲張よくばりょう指定してい正規せいき表現ひょうげん)による表現ひょうげん面倒めんどう字句じく規則きそく代表だいひょうれいに、C言語げんごの「/* コメント */」のようなコメントがある。ルールを直感ちょっかんてき言明げんめいすると「コメントには任意にんい文字もじ使つかえるが、"*/" というならびがあらわれたらそこでわる」というものであるが、これをなにかんがえずにそのまま正規せいき表現ひょうげんにしてしまうと、正規せいき表現ひょうげんの * が最長さいちょう一致いっち欲張よくばり(greedy)なりょう指定してい)であるために、「ソースコードちゅうあらわれる最初さいしょのコメントの開始かいしから、ソースコードちゅうあらわれる最後さいごのコメントの終了しゅうりょう」にマッチしてしまう。正規せいき表現ひょうげん欲張よくばりょう指定してい先読さきよみがあればこれにたいただしい規則きそくくのは簡単かんたんだが、場合ばあい不可能ふかのうではないものの、その規則きそくみやすいものではない。

コメントのれい場合ばあいは、手書てがきの解析かいせきであればそこだけアドホックにちょっと先読さきよみすれば簡単かんたんむが、こういったパターンが意外いがいとあることも、手書てがきがえらばれる理由りゆうのひとつである。また、JavaのGenericsやC++のテンプレートなどの字句じく解析かいせきで「>>」というならびがあらわれうることも、なやましいてんのひとつである(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] これも高速こうそく字句じく解析かいせき生成せいせいする。

[注釈ちゅうしゃく 2] [注釈ちゅうしゃく 3]

脚注きゃくちゅう

[編集へんしゅう]
  1. ^ なおParsing Expression Grammar(PEG)のように、字句じく規則きそく構文こうぶん規則きそく一緒いっしょあつかってしまうこともおお手法しゅほうもあり、「字句じく解析かいせき」と(狭義きょうぎの)「構文こうぶん解析かいせき」という分担ぶんたん絶対ぜったいのものでもない。また実際じっさいのC言語げんご処理しょりけいでは、言語げんご処理しょりけい本体ほんたいまえプリプロセッサによってもトークンとしてのあつかいがある(プリプロセッサトークン)。
  2. ^ プログラミング言語げんご開発かいはつ途中とちゅう段階だんかいでは、仕様しよう頻繁ひんぱんわるため、スキャナ生成せいせいなどの単純たんじゅんなツールのほう有用ゆうよう場合ばあいもある。正規せいき表現ひょうげんとして語彙ごい構成こうせい要素ようそ表現ひょうげんする能力のうりょくにより、字句じく解析かいせき記述きじゅつ容易よういになる。一部いちぶ字句じく解析かいせき生成せいせいは、人間にんげんくのがむずかしい事前じぜん条件じょうけん事後じご条件じょうけん記述きじゅつでき、開発かいはつ時間じかん大幅おおはば節約せつやくするのに役立やくだつ。
  3. ^ なお、コンパイラでは通常つうじょう字句じく解析かいせきつぎには構文こうぶん解析かいせきおこなわれ、その言語げんご処理しょりけい本体ほんたい処理しょりとなる。
  1. ^ a b IT用語ようご辞典じてん e-words【字句じく解析かいせき
  2. ^ コンパイラの技術ぎじゅつしょのバイブル、Alfred V.Aho, Compilers,Principles, Techniques, and Tools のp.5で、字句じく解析かいせきについての、最初さいしょ説明せつめいげられたれいに、ややれいとう記事きじ用意よういしたもの。Ahoの例文れいぶんでは「position」や「initial」や「rate」などの変数へんすうあるいは定数ていすうふくまれている。
  3. ^ Alfred V.Aho, Compilers,Principles, Techniques, and Tools p.5
  4. ^ r2c公式こうしきサイトはこちら[1]
  5. ^ quexのsourceforge.netじょう外部がいぶリンクはこちら[2] ]

参考さんこう文献ぶんけん

[編集へんしゅう]

外部がいぶリンク

[編集へんしゅう]
  • U-Tokenizer - にちちゅうかん自然しぜん言語げんご対応たいおうしている字句じく解析かいせきAPI
  • Flex lexical analyser - lex の GNU ばん
  • JLex - Java 字句じく解析かいせき生成せいせい
  • Quex ('Queχかい') - C++ 字句じく解析かいせき生成せいせい
  • OOLEX - オブジェクト指向しこう字句じく解析かいせき生成せいせい