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

 6. END, INPUT, PRINT の処理 (3)

 各命令の動作にあったC言語プログラムを出力していく。その時、各命令の文法(書式、使い方)の詳細も決めていく。

[PRINT命令]

 INPUT命令の書式を次の形式に決める。

 書式
    PRINT [{文字定数|式}] [{,|;}{文字定数|式} ...]
     [ ] 内は省略することができ、省略したときは、改行するだけである。

 パラメータとして文字定数または式(数値、変数、計算式)を指定するとそのデータを表示する。
 パラメータはカンマまたはセミコロンで区切って複数指定することができる。カンマで区切ったときは間隔としてタブが表示される。セミコロンで区切ったときはデータが連続して表示される。
 書式を構文図で表すと次のようになる。

Print
      変換 PRINT PARA printf("PARA");
printf("\n");
PRINT PARA1;PARA2 printf("PARA1");
printf("PARA2");
printf("\n");
PRINT PARA1,PARA2 printf("PARA1");
printf("\t");
printf("PARA2");
printf("\n");

 PARAは文字定数または式を表す。PARAはカンマまたはセミコロンで区切られて連続させることができる。
 計算式を取得する関数get_shikiは、ファイルgetshiki.cに用意されているので、ホームディレクトリに用意して利用する。get_shikiについては後で説明する。ファイルgetshiki.cはコンパイルして、オブジェクトファイルを作成しておく

cc -c getshiki.c
[main08.c]
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:

80:
81:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "gettoken.h"
/* 関数のプロトタイプ宣言 */
void    mbt_print(void);
void    mbt_input(void);
void    ptab(void);
extern char *get_shiki(void);       /* getshiki.c */
/* グローバル変数 */
int     tab = 1;
void main(int argc, char *argv[])
{
<<省略>>
    /* 命令の判定 */
    for(now = 0; now < last; ++now){
        strcpy(gt_line, list[now]);     /* 字句解析の準備 */
        get_token();                    /* トークンの取得 */
        if(!strcmp("END", token)){      /* 命令の判定 */
            ptab();
            printf("printf(\"終了します\\n\");\n");
            ptab();
            printf("exit(1);\n");
        }else if(!strcmp("INPUT", token))
            mbt_input();                    /* INPUT 命令の処理 */
        else if(!strcmp("PRINT", token))
            mbt_print();                    /* PRINT 命令の処理 */
        else if(!strcmp("FOR", token))
            printf("FOR 命令です\n");
<<省略>>
    printf("}\n");
}
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:
108:
109:
110:
111:
112:

141:
142:
143:

151:
void mbt_print(void)
{
    while(*get_token()){    /* 行の終わりまで繰り返す */
        ptab();
        if(@               )         /* 文字定数 */
            printf("printf(%s\");\n", token);
        else if(*token == '\n'){    /* パラメータなし。行末 */
            printf("printf(\"\\n\");\n");
            break;          /* 終了 */
        }else{                      /* 式 */
            unget_token(token);     /* トークンを戻す */
            printf("printf(\"%%f\", %s);\n", get_shiki());
        }
        get_token();        /* 次のトークン、区切り文字 */
        if(A              ){          /* カンマ */
            ptab();
            printf("printf(\"\\t\");\n");
        }else if(B              )     /* セミコロン */
            /* Nothing */;
        else if(*token == '\n'){     /* 行末 */
            ptab();
            printf("printf(\"\\n\");\n");
            break;
        }else{
            printf("PRINT 文法エラー\n");
            exit(1);
        }
    }
}
void mbt_input(void)
{
<<省略>>
}
void ptab(void)
{
<<省略>>
}
[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@   A   B
     
実行結果
D:\Data\src>cc main08.c getshiki.obj gettoken.obj
lld @link.i
D:\Data\src>main08 reidai2.mb
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
        double hensuu[26];
        char buff[256];
        printf(" ? ");
        gets(buff);
        hensuu[0] = atof(buff);
        printf(" ? ");
        gets(buff);
        hensuu[25] = atof(buff);
        printf("%f",  hensuu[25]);
        printf("\n");
        printf("%f",  hensuu[0]);
        printf("\n");
        printf("終了します\n");
        exit(1);
}




 このように、mbt言語のINPUT命令、PRINT命令とEND命令をC言語プログラムに変換することができるようになった。
 変換されたC言語プログラムをコンパイルするためにはファイルとして保存しなければならない。ファイルへの出力は後にして、ここではリダイレクションでファイルに出力して確認する。

実行結果
D:\Data\src>main08 reidai2.mb > reidai2.c

D:\Data\src>cc reidai2.c
lld @link.i
D:\Data\src>reidai2
 ? 12.34
 ? 34.56
34.560000
12.340000
終了します

reidai2.mb
INPUT A
INPUT Z
PRINT Z
PRINT A
END



前へ 目次へ 次へ 
Copyright © 2001 Hiroshi Masuda 

 

 

inserted by FC2 system