C言語-トランスレータ(mbas to C) |
8. 代入文(計算式)
mini basicの代入文は、C言語とほぼ同じであるから、変数名(A〜Z)だけを配列hensuuに変換すればよい。
変数 = 計算式
計算式はすでに作成した関数get_shiki(ファイルgetshiki.c)で取り出すことができる。
処理としては、最初のトークンが変数であり、かつ、2つ目のトークンが'='であれば代入式であると判断できる。代入式であれば、関数get_shikiで計算式を取り出し表示する。
関数get_shikiは、四則演算だけではなく、論理演算も正しく(例えば、<>は!=に)変換した上で取り出すことができる。ただし、取り出した式の先頭には、空白が1文字付く。
[main10.c] | |
75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: |
else if(!strcmp("REM", token)) printf("REM 命令です\n"); else if(isalpha(@ ) && strlen(A ) == 1){ /* 変数名チェック*/ ptab(tab); printf("hensuu[%d]", B ); /* 変数名変換表示 */ if(*get_token() != '='){ /* = チェック */ printf("代入文 文法エラー \n"); exit(1); } printf(" = %s;\n", C ); /* = と計算式表示 */ }else printf("命令以外です\n"); } printf("}\n"); } |
D:\Data\src>make lcc -c -o main10.obj main10.c lcc -o mbt.exe main10.obj mbt_sub.obj gettoken.obj getshiki.obj lld @link.i D:\Data\src>mbt reidai3.mb #include <stdio.h> #include <stdlib.h> void main(void) { double hensuu[26]; char buff[256]; printf("A="); gets(buff); hensuu[0] = atof(buff); printf("Z="); gets(buff); hensuu[25] = atof(buff); hensuu[23] = hensuu[0] + hensuu[25] * 10; printf("A+Z*10="); printf("%f", hensuu[23]); printf("\n"); hensuu[23] = ( hensuu[0] + hensuu[25] ) * 10; printf("(A+Z)*10="); printf("%f", hensuu[23]); printf("\n"); printf("終了します\n"); exit(1); } D:\Data\src>mbt reidai3.mb > reidai3.c D:\Data\src>cc reidai3.c lld @link.i D:\Data\src>reidai3 A=12.345 Z=10 A+Z*10=112.345000 (A+Z)*10=223.450000 終了します |
INPUT "A=",A INPUT "Z=",Z X = A + Z * 10 PRINT "A+Z*10=";X X = (A + Z) * 10 PRINT "(A+Z)*10=";X END |
※ メインのファイル名をmain10.cとしたので、makefileの1行目を次のように変更する。(サブのファイル名はそのままでよい)
MAIN = main10
Copyright © 2001 Hiroshi Masuda |