【問題17】字句解析プログラムを作ろう:完全マスター! 組み込みC言語プログラミング(19)(3/3 ページ)
コンピュータは人間と違って自然に「文字(字句)」を認識することはできません。字句を識別させるには事前に何が字句かを定めて、その規則に沿ったプログラムを作る必要があります。
字句解析プログラム
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) 先頭の文字はアルファベットまたはアンダースコア(_)
- (2) 2文字目以降の文字はアルファベットまたはアンダースコアまたは数字
- (3) キーワードでないもの
と決められています。
字句解析に関するテクニックを理解すれば、コマンドで動くプログラムなどを作ることができます。
字句解析プログラミングの第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進数で文字コードを指定できます。以上の字句解析は完璧とは言えませんが、処理が複雑になるので省いています。
問題18
それでは、次回の宿題です。
問題17:
C言語のソースプログラムを読み取り、その中にifやintなどの予約語がいくつ現れるか表示します。⇒解答と解説は次回
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 完全マスター! 組み込みC言語プログラミング(18):【問題16】配列で処理をシンプルにする
何らかの数値を読み取って、それに対応する文字列を表示するプログラムは、「switch」を使うやり方を紹介しまたが、文字列の配列(char型の配列)で記述することもできます。 - 完全マスター! 組み込みC言語プログラミング(17):【問題16】再帰を実現するコンピュータの仕組み
C言語のプログラムにおいて、関数が関数内で自分自身を呼び出すことを「再帰」と呼び、whileやforを使わなくても繰り返しのプログラムを書くことができます。再帰を実現するコンピュータの仕組みとともに身につけましょう。 - 完全マスター! 組み込みC言語プログラミング(16):【問題15】変数を制する者は関数を制する
C言語において変数とはある値を記録して出力する機能を指しますが、「外部変数」と「再帰」の理解を深めることで、関数をより自在に扱えるようになります。