InterCodeNode translate_ExtDefList(treenode *ExtDefList_n){ if(ExtDefList_n == NULL){ //deprintf("ExtDefList is NULL\n"); return NULL; } if(ExtDefList_n->child_num != 2){ //extdeflist -> empty //deprintf("ExtDefList is empty\n"); return NULL; }else{ //extdeflist -> extdef extdeflist InterCodeNode node1 = translate_ExtDef(ExtDefList_n->node[0]); InterCodeNode node2 = translate_ExtDefList(ExtDefList_n->node[1]); return produceNodeByNode(node1,node2); } }
struct InterCodes* translate_ExtDefList(struct TreeNode* ExtDefList){ if(ExtDefList->children == NULL){ struct InterCodes* code1 = (struct InterCodes*)malloc(sizeof(struct InterCodes)); code1->code.kind = NONE_; return code1; } else{ struct InterCodes* code1 = translate_ExtDef(ExtDefList->children->neighbours); struct InterCodes* code2 = translate_ExtDefList(ExtDefList->children); struct InterCodes* p = code1; while(p->next != NULL) p = p->next; p->next = code2; code2->prev = p; return code1; } }
//print codes void print_code(char* name) { FILE *fp = fopen(name,"w"); if (fp == NULL) { printf("creating error\n"); return; } start = start -> child -> child; head = translate_ExtDef(start); intercodes mark = head; tail -> next = NULL; // printf("%d\n",tail->prev->code->kind); while (mark != NULL) { switch (mark->code->kind) { case ASSIGN_K: print_op(mark->code->u.assign.left,fp); fputs(" := ",fp); print_op(mark->code->u.assign.right,fp); fputs("\n",fp); break; case ADD_K: print_op(mark->code->u.binop.result,fp); fputs(" := ",fp); print_op(mark->code->u.binop.op1,fp); fputs(" + ",fp); print_op(mark->code->u.binop.op2,fp); fputs("\n",fp); break; case SUB_K: print_op(mark->code->u.binop.result,fp); fputs(" := ",fp); print_op(mark->code->u.binop.op1,fp); fputs(" - ",fp); print_op(mark->code->u.binop.op2,fp); fputs("\n",fp); break; case MUL_K: print_op(mark->code->u.binop.result,fp); fputs(" := ",fp); print_op(mark->code->u.binop.op1,fp); fputs(" * ",fp); print_op(mark->code->u.binop.op2,fp); fputs("\n",fp); break; case DIV_K: print_op(mark->code->u.binop.result,fp); fputs(" := ",fp); print_op(mark->code->u.binop.op1,fp); fputs(" / ",fp); print_op(mark->code->u.binop.op2,fp); fputs("\n",fp); break; case RETURN_K: fputs("RETURN ",fp); print_op(mark->code->u.one.op,fp); fputs("\n",fp); break; case LABEL_K: fputs("LABEL ",fp); print_op(mark->code->u.one.op,fp); fputs(" :\n",fp); break; case GOTO_K: fputs("GOTO ",fp); print_op(mark->code->u.one.op,fp); fputs("\n",fp); break; case IFGOTO_K: fputs("IF ",fp); print_op(mark->code->u.triop.c1,fp); print_relop_type(mark->code->u.triop.reltype,fp); print_op(mark->code->u.triop.c2,fp); fputs("GOTO ",fp); print_op(mark->code->u.triop.label,fp); fputs("\n",fp); break; case DEC_K: fputs("DEC ",fp); print_op(mark->code->u.assign.left,fp); fputs(" ",fp); fprintf(fp,"%d",mark->code->u.assign.right->u.value); fputs("\n",fp); break; case ARG_K: fputs("ARG ",fp); print_op(mark->code->u.one.op,fp); fputs("\n",fp); break; case CALL_K: print_op(mark->code->u.assign.left,fp); fputs(" := CALL ",fp); print_op(mark->code->u.assign.right,fp); fputs("\n",fp); break; case PARAM_K: fputs("PARAM ",fp); print_op(mark->code->u.one.op,fp); fputs("\n",fp); break; case READ_K: fputs("READ ",fp); print_op(mark->code->u.one.op,fp); fputs("\n",fp); break; case WRITE_K: fputs("WRITE ",fp); print_op(mark->code->u.one.op,fp); fputs("\n",fp); break; case FUNCTION_K: fputs("FUNCTION ",fp); print_op(mark->code->u.one.op,fp); fputs(" :\n",fp); break; } mark = mark->next; } fclose(fp); }