Exemplo n.º 1
0
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);
	}
}
Exemplo n.º 2
0
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;
	}
}
Exemplo n.º 3
0
//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);
}