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

 7. 演算命令の機能強化

 各演算命令でも変数が利用できるように、すべての演算命令の仕様を次のように変更する。

書式
 
演算命令 変数1 数値or変数2
 マニュアルなどでは一般的に次のように記述されていることが多い
     演算命令 変数1 {数値|変数2}

 演算の結果は変数1に格納される。


add x 12.3 → x = x + 12.3   演算結果は表示しないで、out命令で表示することにする。
演算命令  変数1  {数値|変数2}
引数1 引数2

 引数1は必ず変数名であるから、配列hensuuの何番目かを計算する。
 引数2は数値または変数のどちらかである。取り出したトークンの先頭文字が英字ならば変数名、数字または"+"または"-"ならば数値、であると判断すればよい。

[mc08.c]
 
11:
12:
13:
14:
15:
16:
 
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
 
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
 
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
 
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
 
<< 省 略 >>
void main(int argc, char *argv[])
{
    FILE    *fp;        /* ファイル操作用 */
    char    inbuff[STRMAX];     /* 入力データ用 */
    int     val;        /* 変数番号用 */

<< 省 略 >>
    while(fgets(gt_line, STRMAX, fp)){     /* データの読み込み */
        get_token();
        if(!strcmp(token, "add")){    /* 命令判定 */
            get_token();                /* 1語取り出し */
            if(!isalpha(*token)){       /* 変数チェック */
                printf("変数を指定してください。\n");
                exit(1);
            }
            val = toupper(*token) - 'A';
            get_token();                /* 1語取り出し */
            if(isalpha(*token)){        /* 変数名 */
                hensuu[val] = hensuu[val] + hensuu[toupper(*token) - 'A'];
            }else if(isdigit(*token) || *token == '+' || *token == '-'){
                hensuu[val] = hensuu[val] + atof(token);
            }else{
                printf("変数または数値を指定してください。\n");
                exit(1);
            }
        }else if(!strcmp(token, "sub")){
           <<赤色の部分(28〜33行)と同じ>>
            get_token();                /* 1語取り出し */
            if(isalpha(*token)){        /* 変数名 */
                hensuu[val] = hensuu[val] - hensuu[toupper(*token) - 'A'];
            }else if(isdigit(*token) || *token == '+' || *token == '-'){
                hensuu[val] = hensuu[val] - atof(token);
            }else{
                printf("変数または数値を指定してください。\n");
                exit(1);
            }
        }else if(!strcmp(token, "mul")){
           <<赤色の部分(28〜33行)と同じ>>
            get_token();                /* 1語取り出し */
            if(isalpha(*token)){        /* 変数名 */
                hensuu[val] = hensuu[val] * hensuu[toupper(*token) - 'A'];
            }else if(isdigit(*token) || *token == '+' || *token == '-'){
                hensuu[val] = hensuu[val] * atof(token);
            }else{
                printf("変数または数値を指定してください。\n");
                exit(1);
            }
        }else if(!strcmp(token, "div")){
           <<赤色の部分(28〜33行)と同じ>>
            get_token();                /* 1語取り出し */
            if(isalpha(*token)){        /* 変数名 */
                hensuu[val] = hensuu[val] / hensuu[toupper(*token) - 'A'];
            }else if(isdigit(*token) || *token == '+' || *token == '-'){
                hensuu[val] = hensuu[val] / atof(token);
            }else{
                printf("変数または数値を指定してください。\n");
                exit(1);
            }
        }else if(!strcmp(token, "end")){
            break;
        }else if(!strcmp(token, "in")){
<< 省 略 >>

 double型変数data1, data2, ansは不要になったので、宣言を削除している。

reidai04.mc
in x
in y
add x y
out x
sub x 11.111
out x
mul x 10
out x
div x -10
out x
end
実行結果
D:\Data\src>cc mc08.c gettoken.obj
lld @link.i
D:\Data\src>mc08 reidai04.mc
in=12.345
in=11.111
23.456000
12.345000
123.450000
-12.345000

 各演算を処理しているプログラム部分が演算子(+,−,*,/)を除いて同じである。次に、共通(類似)部分を関数にするなどしてプログラム全体を短くしてみる。


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

 

 

inserted by FC2 system