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

 7. 代入文(計算式)

 代入文は、「変数 = 計算式」の形式で表され、右辺の計算結果を左辺の変数に格納する。
 計算式を処理する関数expressionは作成済みであるので、ホームディレクトリにコピーして利用する。ファイルは、eval2.cである。
 さらにコンパイルして、オブジェクトファイルを作成しておく。

cc -c eval2.c

 

[expressionの使い方]

 関数expressionは関数get_tokenを使用してトークンに分解している。
 使い方は、次のとおりである。

  1. 計算式(文字列)をグローバル変数gt_lineに格納する。
  2. 最初のトークンを取り出す。
  3. 関数expressionを呼び出す。引数はなく、返却値が計算結果である。

 次のテストプログラムは、入力した計算式を処理して計算結果を表示する。リターンキーのみ入力すると終了する。

[test03.c]
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
#include <stdio.h>
#include "gettoken.h"       /* gettoken.c */
/* 関数プロトタイプ宣言 */
extern double expression(void);    /* 式 */
/* グローバル変数 */
double  hensuu[26];         /* 変数用 A - Z */

void main(void)
{
    while(1){
        printf("式(リターンのみで終了) : ");
        gets(gt_line);
        get_token();
        if(*token == '\0')  /* 空入力 */
            break;
        printf("答え=%f\n", expression());
    }
}
実行結果
D:\Data\src>cc test03.c eval2.c gettoken.obj
lld @link.i
D:\Data\src>test03
式(リターンのみで終了) : (1+2)*3
答え=9.000000
式(リターンのみで終了) : 1+2*3
答え=7.000000
式(リターンのみで終了) : 1+2*(1+2)
答え=7.000000
式(リターンのみで終了) :

 

 この関数expressionを使用して代入文の処理を追加する。
 命令の判定で命令以外であれば代入文の可能性がある。代入文であるかどうかの確認と計算結果の取得の手順は次のとおりである。

  1. 最初のトークンが英字である。
  2. 次のトークンを取り出す。このトークンは「=」である。
  3. 次のトークンを取り出す。
  4. 関数expressionを呼び出し、返却値を変数に格納する。
[mbas07.c]
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:

44:
45:
46:
47:

68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "gettoken.h"
/* 関数プロトタイプ宣言 */
extern void mb_print(void);
extern void mb_input(void);
extern @                         ;    /* eval.c */
/* グローバル変数 */
double  hensuu[26];         /* 変数用(A〜Z) */

void main(int argc, char *argv[])
{
    char    *list[100];     /* プログラムリスト用 */
    char    buff[256];      /* 1行読み込み用 */
    FILE    *fp;            /* ファイルポインタ */
    int     now = 0;        /* 行数カウント */
    int     last;           /* 最終行 */
    int     valnum;         /* 変数番号用 */
<<省 略>>
    /* 命令の処理 */
    for(now = 0; now < last; ++now){
        strcpy(gt_line, list[now]);     /* 字句解析の準備 */
        get_token();                    /* トークンの取得 */
<<省 略>>
        else if(!strcmp("REM", token))
            printf("REM 命令です\n");
        else if(A                   ){   /* 変数(先頭が英字)チェック */
            valnum = *token - 'A';      /* 変数番号記憶 */
            get_token();
            if(*token != B    ){
                printf("代入文が正しくありません\n");
                exit(1);
            }
            get_token();
            hensuu[valnum] = expression();  /* 計算式処理 */
        }else
            printf("命令以外です\n");
    }
}
[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@    A    B
     

 

 ファイルmakefileに計算式処理の関数を含むファイルeval.cのコンパイル情報を追加する。
 コンパイル後、次のmbasプログラムで実行結果を確認する。

MAIN = mbas07
CMDS = mb_cmds
OBJ = $(MAIN).o  $(CMDS).o \
      gettoken.o eval2.o

all:    mbas.exe
mbas.exe: $(OBJ)
 [Tab]  lcc -o mbas.exe $(OBJ)

$(MAIN).o:    $(MAIN).c
$(CMDS).o:    $(CMDS).c
gettoken.o:   gettoken.c gettoken.h
eval.o:       eval2.c
reidai03.mb
INPUT A
INPUT Z
X = A + Z * 10
PRINT X
X = (A + Z) * 10
PRINT X
END
実行結果
D:\Data\src>make
lcc  -c -o mbas07.obj mbas07.c
lcc  -c -o eval2.obj eval.c
lcc -o mbas.exe mbas07.obj mb_cmds.obj gettoken.obj eval2.obj
lld @link.i
D:\Data\src>mbas reidai03.mb
? 12.34
? 43.21
444.440000
555.500000
終了します


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

 

 

inserted by FC2 system