C言語-トランスレータ(mbas to C)
前へ 目次へ 次へ 

 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))

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

[main03.c]
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:

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;           /* 最終行             */

    << 省略 >>
    /* 命令の判定 */
    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 main03.c gettoken.obj
lld @link.i
D:\Data\src>main03 reidai.mb
INPUT 命令です
INPUT 命令です
INPUT 命令です
命令以外です
PRINT 命令です
END 命令です

 関数get_token()でトークンに分解した後、mbtで使える命令と比較し、何の命令かメッセージを表示している。



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

 

 

inserted by FC2 system