C言語-トランスレータ(mbas to C) |
10. 条件分岐 IF - ELSEIF - ELSE - ENDIF
書式
IF 条件1 [THEN]
プログラム A
ELSEIF 条件2
プログラム B
ELSE
プログラム C
ENDIF
変換 | IF 条件1 [THEN] | → if(条件1){ |
プログラム A | ||
ELSEIF 条件2 | → }else if(条件2){ | |
プログラム B | ||
ELSE | → }else{ | |
プログラム C | ||
ENDIF | → } |
IF文、ELSEIF文とELSE文の次の文からは、インデントを1つ深くするので、インデント用の変数tabを1加算しておく。また、ELSEIF文、ELSE文とENDIF文は表示する前にインデントを1つ浅くする。
これらの変換処理のプログラムは特別に関数を作成するほどのものでもないのでメインプログラムの命令判定の部分に記述する。
[main12.c] | |
67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: |
}else if(!strcmp("NEXT", token)){ --tab; /* インデントを1つ浅くする */ ptab(); printf("}\n"); /* NEXT 命令の処理 */ }else if(!strcmp("IF", token)){ ptab(); printf(@ ); /* IF 命令の処理 */ printf("%s", get_shiki()); printf("){\n"); ++tab; }else if(!strcmp("ELSEIF", token)){ --tab; ptab(); printf(A ); /* ELSEIF 命令の処理 */ printf("%s", get_shiki()); printf("){\n"); ++tab; }else if(!strcmp("ELSE", token)){ --tab; ptab(); printf(B ); /* ELSE 命令の処理 */ ++tab; }else if(!strcmp("ENDIF", token)){ --tab; ptab(); printf(C ); /* ENDIF 命令の処理 */ }else if(!strcmp("REM", token)) printf("REM 命令です\n"); else if(isalpha(*token) && strlen(token) == 1){ /* 変数名チェック*/ ptab(); printf("hensuu[%d]", *token - 'A'); /* 変数名変換表示 */ if(*get_token() != '='){ /* = チェック */ printf("代入文 文法エラー \n"); exit(1); } printf(" = %s;\n", get_shiki()); /* = と計算式表示 */ }else printf("命令以外です\n"); } printf("}\n"); } |
INPUT "IF A=12.375 ? A=",A IF A=12.375 THEN PRINT "A=12.375" ELSE PRINT "Not A=12.375" ENDIF INPUT "DATA A=",A INPUT "DATA B=",B IF A=B THEN PRINT "A=B" ELSEIF A<B THEN PRINT "A<B" ELSE PRINT "A>B" ENDIF END |
D:\Data\src>make lcc -c -o main12.obj main12.c lcc -o mbt.exe main12.obj mbt_sub2.obj gettoken.obj getshiki.obj lld @link.i D:\Data\src>mbt reidai5.mb > reidai5.c D:\Data\src>cc reidai5.c lld @link.i D:\Data\src>reidai5 IF A=12.375 ? A=12.375 A=12.375 DATA A=12.34 DATA B=32.45 A<B 終了します |
main12.cではわかりやすくするために表示する文を分けて書いている。実行速度を上げるには、できるだけ文を少なくすることが一番である。このmain12.cで追加した部分では73〜75行目、80〜82行目がそれぞれ1行で書ける。
printf("if("); printf("%s", get_shiki()); printf("){\n"); |
→ |
printf("if(%s){\n", get_shiki()); |
printf("}else if("); printf("%s", get_shiki()); printf("){\n"); |
→ |
printf("}else if(%s){\n", get_shiki()); |
Copyright © 2001 Hiroshi Masuda |