|
===================================== 〔語彙分解〕的な部分一致の検索結果は以下の通りです。 ・ 字 : [じ, あざな] 【名詞】 1. character 2. hand-writing ・ 字句 : [じく] 【名詞】 1. wording 2. words and phrases 3. way of expression 4. token ・ 句 : [こう, く] (n) sentence ・ 解析 : [かいせき] 1. (n,vs) (1) analysis 2. (2) parsing
字句解析 (じくかいせき、) とは、広義の構文解析の前半の処理で、自然言語の文やプログラミング言語のソースコードなどのベタな文字列を解析して、後半の狭義の構文解析で最小単位(終端記号)となっている「トークン」の並びを得る手続きである。字句解析を行うプログラムは字句解析器である。自然言語の字句解析については形態素解析を参照。 == トークン == まずトークンの必要性について説明する。たとえばソースコード中の「 let x := 100 」という記述において「let」というキーワードや「100」という数字列は、それでひとつの意味を持つカタマリであり、それ以上細かく意味を持たない。このようなカタマリのことを「トークン」という。また let と x の間にある空白など一般に空白類は、意味があるとしても、それがないと繋がってしまう場合に切り離す以上の意味は普通は無く、構文規則には通常そういったものは含めない。他にも、「 / 」といったようなコメントや「"文字列 / 」のような文字列リテラルなどのようなものも、入力を最初に処理する段階でひとかたまりとしてしまったほうが扱いやすい。コメントの場合はそのまま捨ててしまうこともある。また「100」に、数値として整数の100という値を、この段階で与えてしまったほうがやはり扱いやすい。ただし、Parsing Expression Grammar(PEG)のように、字句の規則も構文規則と一緒に扱ってしまうことも多い手法もあり、「字句解析」と(狭義の)「構文解析」という分担は絶対のものでもない。また実際のC言語の処理系では、言語処理系本体の前にプリプロセッサによってもトークンとしての扱いがある(プリプロセッサトークン)。 C言語での文 ''sum=3+2;'' を考えてみよう。これは、次の表のようにトークン化される。 構文解析と同様、字句解析にも字句解析器の生成系がある。古くから広く使われているツールに lex がある。lex では、各種のトークンの字句規則を正規表現で記述する。入力がどの規則にもマッチしないようであればエラーとする。 字句解析の次には構文解析が行われ、その後は言語処理系本体の処理となる。 例えば、"46 - number_of(cows); " という計算式を表すテキストを考えてみよう。このテキストは "46"、"-"、"number_of"、"("、"cows"、")"、";" のように分解される。字句解析器は "46" を「数値」トークン、"-" を「文字」トークン、"number_of" を独立したトークンとする。C言語のような言語では、";" も特別な意味を持つ(言語によっては、単なるセパレータとして空白と同様の捨ててしまってもよいものとして扱えるかもしれないが、C言語の場合には構造体の宣言の直後に、返却値の型を省略した関数定義がある場合、前者の最後の ";" が無いと、その構造体を返却値の型とする関数を定義していることになってしまう、といった場合がある、ということ)。トークンはトークンとして認識されるだけの段階では妥当性は必ずしも考慮されない。例えば、上記の例で "cows" や "number_of" は(おそらく)その言語にとっては意味がないが、トークンとしては問題ない(たとえば数値の値が、その言語で扱えるいかなる型がサポートする範囲よりも大きい、など、エラーにすることもある)。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「字句解析」の詳細全文を読む スポンサード リンク
|