mainの次に、skip_wordやskip_stringなどの自作関数の説明をしましょう。問題17は文字の並びからプログラムを構成する要素、つまり字句(token)の並びとして補えるプログラムを作る問題です。例えばC言語の字句には、キーワード、識別子、定数、文字列リテラル、区切り子、コメントなどがあって、キーワードは、
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
のいずれか、識別子は
と決められています。
字句解析に関するテクニックを理解すれば、コマンドで動くプログラムなどを作ることができます。
字句解析プログラミングの第1歩は、字句に関する約束を明確にすることです。字句形式の表し方はいろいろありますが、今回は以下のように図示してみます。
「英字」はAからZまたはaからzのいずれかの文字であることを以下のように表します。矢印線が文字の並びの流れで、分岐しているカ所はいずれかの経路をたどるという意味です。
同様に「英数字」は次のように表せます。
すると「単語」は次のように表せます。
最後にプログラムを書いてみます。選択構造はif文で、繰り返し構造はwhile文で書けるので、「単語」は次のようにプログラムに書き直すことができます。
ch = fgetc(fp); if (isalpha(ch) || (ch == '_')) { ch = fgetc(fp); while (isalnum(ch) || (ch == '_')) { ch = fgetc(fp); } }
文字列の場合はどうでしょうか。ダブルコーテーション(”)で囲まれた部分です。ただしエスケープシーケンス(エン(\)に続く文字)に配慮しなければなりません。
図からC言語のプログラムを書くと、
ch = fgetc(fp); if (ch == '¥"') { ch = fgetc(fp); while (ch != '¥"') { if (ch == '¥¥') ch = fgetc(fp); ch = fgetc(fp); } }
のようになります。
実はC言語のエスケープシーケンスでは、8進数または16進数で文字コードを指定できます。以上の字句解析は完璧とは言えませんが、処理が複雑になるので省いています。
それでは、次回の宿題です。
C言語のソースプログラムを読み取り、その中にifやintなどの予約語がいくつ現れるか表示します。⇒解答と解説は次回
Copyright © ITmedia, Inc. All Rights Reserved.