C言語-トランスレータ(mbas to C) |
6. END, INPUT, PRINT の処理 (3)
各命令の動作にあったC言語プログラムを出力していく。その時、各命令の文法(書式、使い方)の詳細も決めていく。
[PRINT命令]
INPUT命令の書式を次の形式に決める。
書式
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) { <<省略>> } |
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 終了します |
INPUT A INPUT Z PRINT Z PRINT A END |
Copyright © 2001 Hiroshi Masuda |