1、プログラムと各部の説明 作成したコンパイラのプログラムの説明を行う。 最初に作成したコンパイラのプログラムを記述しておく。 プログラムソース'compiler.c'ここから↓ ------------------------------------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------------------*/ /* 四則演算を解析するコンパイラ */ /*--------------------------------------------------------------------------------------------*/ /* 作成者:松本亮介(Ryousuke Matsumoto) */ /* 作成日:2006.01.31 */ /*--------------------------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------------------------*/ /* ファイル名: compiler.c */ /*--------------------------------------------------------------------------------------------*/ #include #include #include #define MAXLENG 128 #define MAXLENGS 256 /* ------------サブルーチンここから--------------- */ int lexical_analysis(void);/* 字句解析関数 */ int syntactic_analysis_1(void);/* 構文解析関数1 */ void syntactic_analysis_2(void);/* 構文解析関数2 */ void syntactic_analysis_3(void);/* 構文解析関数3 */ void syntactic_analysis_4(void);/* 構文解析関数4 */ int code_generation(void);/* コード生成関数 */ /* ----------------------------------------------- */ /* ---------グローバル宣言--------- */ FILE *fp,*fp2; /* ----------字句解析の字句と種類を格納する構造体ここから-------- */ struct character{ char jiku[MAXLENG]; int result; }lexical_result[MAXLENG],syntactic_result[MAXLENG]; /* ---------字句解析の字句と種類を格納する構造体ここまで--------- */ int i=0,j=0,n,o; int num,gyou_kaihi; int stack[MAXLENGS]; char op,*temp[MAXLENGS]; /* -------------------------------- */ /* ---------------------------------------メインルーチンここから----------------------------------------- */ int main(int argc,char *argv[]){ int ni; if((fp=fopen(argv[1],"r"))==NULL){ printf("Cannot Open File.\n"); exit(1); } fp2=fopen("compiler_data.txt","w"); ni=1; do{ while(op!=';'){ gyou_kaihi=ni; fprintf(fp2,"【%d-gyoume】\n",ni); ni++; fprintf(fp2,"【motono-siki】\n"); lexical_analysis();/* 字句解析関数呼び出し */ fprintf(fp2,"\n"); syntactic_analysis_1();/* 構文解析関数呼び出し */ code_generation();/* コード生成関数呼び出し */ } op=getc(fp); }while(op!=EOF); printf("\nIt succeeded in making 'compiler_data.txt'.\n"); return 0; } /* ------------------------------------------メインルーチンここまで--------------------------------------- */ /* -------------------------------------サブルーチン(字句解析)ここから---------------------------------- */ /* --------------------------------- ・構造体のresultに字句の種類を格納 ・構造体のjikuに字句を格納 --------------------------------- */ int lexical_analysis(){ int d,h,li,li2; d=0,h=0; for(li=0;li