C言語-トランスレータ(mbas to C) |
4. 命令(文字列)の判定
字句解析で得られたトークンがmbasの命令であるかを判定する。一般のBASICであれば、
IF "INPUT" = TOKEN$ THEN
のようにIF文で比較できるが、C言語で
if("INPUT" == token) ←これはエラー
のようにすると取得したトークンの先頭番地と文字列定数の先頭番地の番地どうしを比較することになる。
文字列を比較するためには、関数strcmpを使用する。
strcmp("INPUT", token)
文字列が同じであれば、関数strcmpは0を返す。したがって、if文の中で
if(strcmp("INPUT", token) == 0)
と記述すれば文字列の比較ができ、同じであれば真になる。
一般的には、否定演算子(!)を使用して次のように記述する。
if(!strcmp("INPUT", token))
mbtの命令は各行の先頭にあるので、それを関数get_tokenで取り出し、何の命令かを判定する処理を追加する。ただし、具体的な処理は後で考えることにし、ここでは何の命令かを表示するだけにする。
[main03.c] | |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "gettoken.h" void main(int argc, char *argv[]) { char *list[100]; /* プログラムリスト用 */ char buff[256]; /* 1行読み込み用 */ FILE *fp; /* ファイルポインタ */ int now = 0; /* 行数カウント */ int last; /* 最終行 */ << 省略 >> /* 命令の判定 */ for(now = 0; now < last; ++now){ strcpy(gt_line, list[now]); /* 字句解析の準備 */ get_token(); /* トークンの取得 */ if(@ ("END", token)) /* 命令の判定 */ printf("END 命令です\n"); else if(@ ("INPUT", token)) printf("INPUT 命令です\n"); else if(@ ("PRINT", token)) printf("PRINT 命令です\n"); else if(@ ("FOR", token)) printf("FOR 命令です\n"); else if(@ ("NEXT", token)) printf("NEXT 命令です\n"); else if(@ ("IF", token)) printf("IF 命令です\n"); else if(@ ("ELSEIF", token)) printf("ELSEIF 命令です\n"); else if(@ ("ELSE", token)) printf("ELSE 命令です\n"); else if(@ ("ENDIF", token)) printf("ENDIF 命令です\n"); else if(@ ("REM", token)) printf("REM 命令です\n"); else printf("命令以外です\n"); } } |
D:\Data\src>cc main03.c gettoken.obj lld @link.i D:\Data\src>main03 reidai.mb INPUT 命令です INPUT 命令です INPUT 命令です 命令以外です PRINT 命令です END 命令です |
関数get_token()でトークンに分解した後、mbtで使える命令と比較し、何の命令かメッセージを表示している。
Copyright © 2001 Hiroshi Masuda |