検索
連載

【問題17】字句解析プログラムを作ろう完全マスター! 組み込みC言語プログラミング(19)(3/3 ページ)

コンピュータは人間と違って自然に「文字(字句)」を認識することはできません。字句を識別させるには事前に何が字句かを定めて、その規則に沿ったプログラムを作る必要があります。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

字句解析プログラム

 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のいずれかの文字であることを以下のように表します。矢印線が文字の並びの流れで、分岐しているカ所はいずれかの経路をたどるという意味です。

photo

 同様に「英数字」は次のように表せます。

photo

 すると「単語」は次のように表せます。

photo

 最後にプログラムを書いてみます。選択構造はif文で、繰り返し構造はwhile文で書けるので、「単語」は次のようにプログラムに書き直すことができます。

    ch = fgetc(fp);
    if (isalpha(ch) || (ch == '_')) {
        ch = fgetc(fp);
        while (isalnum(ch) || (ch == '_')) {
              ch = fgetc(fp);
        }
    }

 文字列の場合はどうでしょうか。ダブルコーテーション(”)で囲まれた部分です。ただしエスケープシーケンス(エン(\)に続く文字)に配慮しなければなりません。

photo

 図から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などの予約語がいくつ現れるか表示します。⇒解答と解説は次回


お知らせ

photo
「CADLUS+Arduino電子工作ガイド」

本連載「完全マスター! 組み込みC言語プログラミング」も好評掲載中の横田氏による書籍「CADLUS+Arduino電子工作ガイド」(オーム社)が発売中です。

Arduinoと無料プリント基板CAD「CADLUS PCB」を組み合わせた電子工作の手法を示すもので、実際にサンプルを示しながら、プリント基板の設計、作成から組み立て、プログラムまでを手順を追って解説しています。



Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る