="LPC1114 簡単なインタプリタを作ろう

  NXPセミコンダクタ社LPCXpresso 基板は, fgets() 関数と fputs() 関数を使って,開発環境からデータを入出力することができます.この機能を使うと,もっと違ったことができます.

入力によって振る舞いを変えるプログラム

 前回作成したプロジェクト proj02 をさらに変更して,コンソール・ビューから入力された内容によって,返すメッセージを変えるプログラム,つまりインタプリタを作成しました.

/*
===============================================================
 Name        : main.c
 Author      : noritan
 Version     :
 Copyright   : Copyright (C) 2010 noritan.org
 Description : main definition
===============================================================
*/

#ifdef __USE_CMSIS
#include "LPC11xx.h"
#endif

#include <stdio.h>
#include <string.h>

int interpret(const char *line) {
    // Escape from the program
    if (strncmp(line, "bye", 3) == 0) {
        fputs("Good bye.\n", stdout);
        return 1;
    }
    // Say hello
    if (strncmp(line, "hello", 5) == 0) {
        fputs("Hello. How are you today?\n", stdout);
        return 0;
    }
    // Sing a song
    if (strncmp(line, "sing", 4) == 0) {
        fputs("Daisy, Daisy, ...\n", stdout);
        return 0;
    }
    // Unknown command
    fputs("What ?\n", stdout);
    return 0;
}

int main(void) {
    char line[64];
    int done;

    // Show message
    fputs("HELLO WORLD\n", stdout);

    do {
        // Get a line
        fgets(line, sizeof line, stdin);

        // Interpret
        done = interpret(line);
    } while (!done);

    while (1) {
    }
    return 0;
}

 main() 関数で,64文字以内の入力を行い,入力された文字列を interpret() 関数に渡して解析と処理をおこないます.そして, interpret() 関数が, 0 以外の整数値を返すまで,入力を続けます.

インタプリタ部分の解説

 文字列の解析を行う interpret() 関数を解説します.この関数は,処理の終了条件を検出したら,整数値 1 を返します.

int interpret(const char *line) {
    // Escape from the program
    if (strncmp(line, "bye", 3) == 0) {
        fputs("Good bye.\n", stdout);
        return 1;
    }

 一番目の処理は,終了コマンド("bye")の検出を行います.ここで使われている strncmp() 関数は,ヘッダ・ファイル <string.h> で宣言されている関数で, LPCXpresso のライブラリに含まれています.

 入力行の頭から3文字目までが "bye" と等しいとき,コンソールに "Good bye." を表示して, interpret() 関数の処理を終えます.このとき,整数値 1 を返すので, main() 関数に戻ったときに,無限ループに飛び込みます.

    // Say hello
    if (strncmp(line, "hello", 5) == 0) {
        fputs("Hello. How are you today?\n", stdout);
        return 0;
    }

 二番目の処理は,あいさつコマンド("hello")の処理です. "hello" が検出されたら,コンソールにあいさつメッセージを表示して,処理を終え,整数値 0 を返します.

    // Sing a song
    if (strncmp(line, "sing", 4) == 0) {
        fputs("Daisy, Daisy, ...\n", stdout);
        return 0;
    }

 三番目の処理は,歌うコマンド("sing")の処理です. "sing" が検出されたら,コンソールに歌のメッセージを表示して,処理を終え,整数値 0 を返します.

    // Unknown command
    fputs("What ?\n", stdout);
    return 0;
}

 最後の処理は,未知のコマンドの処理です.未知のコマンドが検出されたら,コンソールに "What ?" を表示して,処理を終え,整数値 0 を返します.

実行してみよう

 プログラムができたら,実行してみましょう.

インタプリタの実行

 このように,入力したコマンドにより,振る舞いの異なるプログラムができました.別のコマンドも増やして,試してみましょう.

 次回は,構文解析に挑戦します.

田中範明(noritan.org)


トラックバック(0)

このブログ記事を参照しているブログ一覧: LPCXpresso で HELLO WORLD (3)

このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/4128





カテゴリ


Copyright (C) 2006-2015 CQ Publishing Co.,Ltd. All Rights Reserved.