C言語-インタプリタminiBASIC
前へ 目次へ 次へ 

 4. 命令(文字列)の判定

 字句解析で得られたトークンがmbasの命令であるかを判定する。一般のBASICであれば、

IF "INPUT" = TOKEN$ THEN

のようにIF文で比較できるが、C言語で

if("INPUT" == token)

のようにすると取得したトークンの先頭番地と文字列定数の先頭番地を比較することになる。
 文字列を比較するためには、次のように関数strcmpを使用する。

strcmp("INPUT", token)

このとき、文字列が同じであれば、関数strcmpは0を返す。したがって、if文の中で

if(strcmp("INPUT", token) == 0)

と記述すれば文字列の比較ができ、同じであれば真になる。一般的には、否定演算子(!)を使用して次のように記述する。

if(!strcmp("INPUT", token))

 mbasの命令は、各行の先頭にあるので、それを関数get_tokenで取り出して何の命令かを判定する処理を追加する。ただし、具体的な処理は後で考えることにし、ここでは命令だけを表示することにする。

[mbas03.c]
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "gettoken.h"
void main(int argc, char *argv[])
{
    char    *list[100];     /* プログラムリスト用 */
    char    buff[256];      /* 1行読み込み用 */
    FILE    *fp;            /* ファイルポインタ */
    int     now = 0;        /* 行数カウント */
    int     last;           /* 最終行 */

    if(argc != 2){          /* ファイル名指定なし */
        printf("ファイル名の指定がありません\n");
        exit(1);                /* 強制終了 */
    }
    /* ファイルのオープン */
    if((fp = fopen(argv[1], "r")) == NULL){
        printf("ファイルがオープンできません\n");
        exit(1);
    }
    /* ファイルの読み込み */
    while(fgets(buff, 256, fp) != NULL){        /* 1行読み込み */
        list[now] = (char *)malloc(strlen(buff) + 1);   /* 領域確保 */
        if(list[now] == NULL){
            printf("領域確保に失敗しました\n");
            exit(1);
        }
        strcpy(list[now], buff);    /* 確保した領域にデータコピー */
        ++now;
    }
    last = now;         /* 最終行番を格納 */
    /* ファイルのクローズ */
    fclose(fp);
    /* 命令の処理 */
    for(now = 0; now < last; ++now){
        strcpy(gt_line, list[now]);     /* 字句解析の準備 */
        get_token();                    /* トークンの取得 */
        if(@        ("END", token))     /* 命令の判定 */
            printf("END 命令です\n");
        else if(@        ("INPUT", token))
            printf("INPUT 命令です\n");
        else if(@        ("PRINT", token))
            printf("PRINT 命令です\n");
        else if(@        ("FOR", token))
            printf("FOR 命令です\n");
        else if(@        ("NEXT", token))
            printf("NEXT 命令です\n");
        else if(@        ("IF", token))
            printf("IF 命令です\n");
        else if(@        ("ELSEIF", token))
            printf("ELSEIF 命令です\n");
        else if(@        ("ELSE", token))
            printf("ELSE 命令です\n");
        else if(@        ("ENDIF", token))
            printf("ENDIF 命令です\n");
        else if(@        ("REM", token))
            printf("REM 命令です\n");
        else
            printf("命令以外です\n");
    }
}
実行結果
D:\Data\src>cc mbas03.c gettoken.obj
lld @link.i
D:\Data\src>mbas03 reidai01.mb
INPUT 命令です
INPUT 命令です
命令以外です
PRINT 命令です
END 命令です
[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@
     


前へ 目次へ 次へ 
Copyright © 2001 Hiroshi Masuda 

 

 

inserted by FC2 system