C言語-インタプリタminiBASIC |
7. 代入文(計算式)
代入文は、「変数 = 計算式」の形式で表され、右辺の計算結果を左辺の変数に格納する。
計算式を処理する関数expressionは作成済みであるので、ホームディレクトリにコピーして利用する。ファイルは、eval2.cである。
さらにコンパイルして、オブジェクトファイルを作成しておく。
cc -c eval2.c
[expressionの使い方]
関数expressionは関数get_tokenを使用してトークンに分解している。
使い方は、次のとおりである。
次のテストプログラムは、入力した計算式を処理して計算結果を表示する。リターンキーのみ入力すると終了する。
[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を使用して代入文の処理を追加する。
命令の判定で命令以外であれば代入文の可能性がある。代入文であるかどうかの確認と計算結果の取得の手順は次のとおりである。
[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"); } } |
ファイル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
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 |