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 

 

 

inserted by FC2 system