C言語-トランスレータ(mbas to C)
前へ 目次へ 次へ 

 10. 条件分岐 IF - ELSEIF - ELSE - ENDIF

書式
    IF 条件1 [THEN]
      プログラム A
    ELSEIF 条件2
      プログラム B
    ELSE
      プログラム C
    ENDIF
  1. IF文の条件1が真のときプログラムAを実行し、ENDIF文の次の行に移る。
  2. IF文の条件1が偽で、ELSEIF文の条件2が真のときプログラムBを実行し、ENDIF文の次の行に移る。
  3. IF文の条件1、ELSEIF文の条件2が偽のとき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");
}
[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@   A   B   C
     
reidai5.mb
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 

 

 

inserted by FC2 system