#include #include #include #define TRUE 1 #define FALSE 0 #define LINE_LENGTH 100 // ÆÄÀÏÇÑÁÙÀÇ ÃÖ´ëÄ¡¼³Á¤ struct SYM_REFERENCE { int symref_position; // ÂüÁ¶ À§Ä¡º¯¼ö struct SYM_REFERENCE *sp_nsymref; }; struct SYM_TABLE { int symbolLineNumber; // SYMBOL ÀÇ À§Ä¡ÀÇ Çà char c_sbname[8]; // ÇöÀçSYMBOLÀÇÀ§Ä¡ int confirmAdded; // SYM_TABLEÀÌ addsymref() ÇÔ¼ö¿¡¼­Ãß°¡µÇ¾ú´ÂÁö booleanÀ¸·Î È®ÀÎ struct SYM_REFERENCE *sp_fsymref; // first referencelist - current SYMBOL struct SYM_REFERENCE *sp_lsymref; // end referencelist - current SYMBOL struct SYM_TABLE *sp_nsymbol; // next sym_table address }; struct SYM_TABLE *sp_fsymbol; int addsymbol(char *cp_symname, struct SYM_TABLE *sp_fsymtab, int i_crow); int addsymref(char *cp_symname, struct SYM_TABLE *sp_fsymtab, int i_crow); void symbol_intlz(struct SYM_TABLE *sp_isymtab); void symref_intlz(struct SYM_REFERENCE *sp_isymtab); struct SYM_TABLE *f_operand_rm(struct SYM_TABLE *sp_fsymtab); int addsymref(char *cp_symname, struct SYM_TABLE *sp_fsymtab, int i_crow) { struct SYM_TABLE *sp_csymtab = sp_fsymtab; // ÇöÀçSYM_TABLEÀÇÁÖ¼Ò°ª do { if(strcmp(sp_csymtab->c_sbname,cp_symname) == FALSE) { if(sp_csymtab->sp_fsymref != NULL) // À̷̹¹ÆÛ·±½ºµÈSYM_REFERENCE Å×À̺íÀÌÀÖÀ»¶§ { sp_csymtab->sp_lsymref->sp_nsymref = (struct SYM_REFERENCE *) malloc(sizeof(struct SYM_REFERENCE)); sp_csymtab->sp_lsymref = sp_csymtab->sp_lsymref->sp_nsymref; symref_intlz(sp_csymtab->sp_lsymref); sp_csymtab->sp_lsymref->symref_position = i_crow; break; } else // À̷̹¹ÆÛ·±½ºµÈSYMREF Å×À̺íÀ̾øÀ»¶§ { sp_csymtab->sp_fsymref = (struct SYM_REFERENCE *) malloc(sizeof(struct SYM_REFERENCE)); sp_csymtab->sp_lsymref = sp_csymtab->sp_fsymref; symref_intlz(sp_csymtab->sp_lsymref); sp_csymtab->sp_lsymref->symref_position = i_crow; break; } } else if(sp_csymtab->sp_nsymbol == NULL) // ¸¶Áö¸·±îÁöSYM_TABLEÀ»Ã£¾ÒÀ¸³ªOPEREND ÂüÁ¶¿Í¸Â´ÂSYM_TABLEÀ̾øÀ»¶§ { sp_csymtab->sp_nsymbol = (struct SYM_TABLE *) malloc(sizeof(struct SYM_TABLE)); sp_csymtab = sp_csymtab->sp_nsymbol; symbol_intlz(sp_csymtab); // ±¸Á¶Ã¼ÃʱâÈ­ strcpy(sp_csymtab->c_sbname , cp_symname); sp_csymtab->confirmAdded = TRUE; sp_csymtab->sp_fsymref = (struct SYM_REFERENCE *) malloc(sizeof(struct SYM_REFERENCE)); sp_csymtab->sp_lsymref = sp_csymtab->sp_fsymref; symref_intlz(sp_csymtab->sp_lsymref); sp_csymtab->sp_lsymref->symref_position = i_crow; break; } else sp_csymtab = sp_csymtab->sp_nsymbol; }while(TRUE); // SYM_TABLEÀǸ¶Áö¸·±îÁö°°ÀºSYMBOLÀ»Ã£´Â´Ù. return 0; }