C言語-トランスレータ(mbas to C) |
6. 関数get_shiki()の解説
計算式をひとまとめに得るための関数である。例えば、次の式の場合、
1 + 2 * 3 / 4
関数get_token()では、1, +2, *, 3, /, 4というように分解される。しかし、式は1 + 2 * 3 / 4のままひとまとめに取り出せた方が便利である。また、次の式の場合、変数Aはhensuu[0]と変換しなければならない。
2 * A / 5 →変換後→ 2 * hensuu[0] / 5
このように式をひとまとめに取り出せるようにしておけば、代入文を処理するときも便利である。さらに、IF文の条件式も取り出せるようにする。
mbt言語の条件式はBASICを元にしているので、BASICと同じ=, >, <, >=,
<=, <>の比較演算子が使えるようにする。>, <, >=, <=は、C言語でも同じであるが、=はC言語では==、<>は!=に変換する必要がある。
IF A = B THEN →変換後→ if(hensuu[0] == hensuu[1]){
IF A <> B THEN →変換後→ if(hensuu[0] != hensuu[1]){
処理の流れについてはプログラムリストをゆっくりと見て欲しい。
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include "gettoken.h" char *get_shiki(void) { static char buff[256]; /* 取り出した式用 */ char work[80]; buff[0] = '\0'; while(*get_token()){ /* トークン取り出し */ if(isalpha(*token) && strlen(token) == 1) /* 変数名 */ sprintf(work, " hensuu[%d]", *token - 'A'); else if(isdigit(*token)){ /* 数値 */ strcpy(work, " "); strcat(work, token); }else if(*token == '=') /* = 等しい */ strcpy(work, " =="); else if(*token == '<'){ /* < */ get_token(); if(*token == '=') /* <= 以下 */ strcpy(work, " <="); else if(*token == '>') /* <> 等しくない */ strcpy(work, " !="); else{ /* < より小さい */ strcpy(work, " <"); unget_token(token); } }else if(*token == '>'){ /* > */ get_token(); if(*token == '=') /* >= 以上 */ strcpy(work, " >="); else{ /* > より大きい */ strcpy(work, " >"); unget_token(token); } }else if(strchr("+-*/()", *token)) /* 演算子 */ sprintf(work, " %s", token); else /* その他 */ break; /* 終了 */ strcat(buff, work); } unget_token(token); return(buff); } |
*関数sprintf()
関数printfの仲間である。
printf(format, para); はparaの値をformatの書式にしたがってディスプレイに出力する。
sprintf(v, format, para);はparaの値をformatの書式にしたがって変数vに記憶させる。変数vには文字列が記憶されるのでchar型で十分な大きさの配列でなければならない。
テスト用のプログラム
関数get_shiki()だけでは実行できないので、簡単なテストができるようにmainのプログラムを次に示す。
実行後、計算式を入力すると、必要な変換がされて結果が出力される。これを繰り返し、@を入力すると終了する。
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: |
#include <stdio.h> #include <string.h> #include "gettoken.h" void main(void) { extern char *get_shiki(void); char buff[256]; while(1){ printf("式(END=@) : "); gets(buff); if(buff[0] == '@') break; strcpy(gt_line, buff); printf("%s\n", get_shiki()); } } |
D:\Data\src>cc t-shiki.c getshiki.obj gettoken.obj lld @link.i D:\Data\src>t-shiki 式(END=@) : 1+2*3/4 1 +2 * 3 / 4 式(END=@) : 2*A/5 2 * hensuu[0] / 5 式(END=@) : A=B hensuu[0] == hensuu[1] 式(END=@) : A<>B hensuu[0] != hensuu[1] 式(END=@) : @ |
Copyright © 2001 Hiroshi Masuda |