Node* comp_reduction (Node* node, char op) { Node *aux, *aux2; int num1, num2; int boolean; aux = node; if (aux->right->type == 'n') num1 = aux->right->number; else{ aux2 = aux->right; do{ aux2 = reduce_graph(aux2, 1); }while(aux2->type != 'n'); num1 = aux2->number; } if (aux->left->right->type == 'n') num2 = aux->left->right->number; else{ aux2 = aux->left->right; do{ aux2 = reduce_graph(aux2, 1); }while(aux2->type != 'n'); num2 = aux2->number; } switch (op){ case '>': boolean = gt_operator(num2, num1); break; case '<': boolean = lt_operator(num2, num1); break; case '=': boolean = eq_operator(num2, num1); break; default: printf("Operador deve ser >, < ou =\n"); break; } if (boolean) aux = stack[stack_point - 3]->right; else aux = stack[stack_point - 4]->right; return aux; }
int main() { Node *root, *aux; int size, check = 1, number, temp, num1, num2; clock_t c2, c1; float _time; scanf("%s", input); transform_input(); printf("(%s)\n", input); size = strlen(input); root = make_graph(0, size - 1); printf("Original Graph:\n"); print_graph(root); printf("\n"); printf("Start..\n"); c1 = clock(); root = reduce_graph(root, 0); c2 = clock(); _time = (c2 - c1)*1000/CLOCKS_PER_SEC; printf("\n\nEnd!\n"); printf("Reduced Graph:\n"); print_graph(root); printf("\nTempo de redução: %dhs %dmin %dseg %dmiliseg\n\n", (((int) _time)/1000)/3600, ((((int) _time)/1000)%3600)/60, ((((int) _time)/1000)%3600)%60, ((int) _time) - (((int) _time)/1000)*1000); printf("\n"); return 0; }
Node* div_reduction (Node* node) { Node *aux, *div, *div_aux, *aux2; int n1, n2,res; char num1, num2; div = (Node*) malloc(sizeof(Node)); div_aux = (Node*) malloc(sizeof(Node)); aux = node; if (aux->right->type == 'n') n1 = aux->right->number; else{ aux2 = aux->right; do{ aux2 = reduce_graph(aux2, 1); }while(aux2->type != 'n'); n1 = aux2->number; } if (aux->left->right->type == 'n') n2 = aux->left->right->number; else{ aux2 = aux->left->right; do{ aux2 = reduce_graph(aux2, 1); }while(aux2->type != 'n'); n2 = aux2->number; } //printf("N1 = %d\nN2 = %d\n", n1, n2); res = n2 / n1; div_aux->type = 'n'; div_aux->number = res; div_aux->right = NULL; div_aux->left = NULL; return div_aux; }
int reduce(MODULE *module, FUNCTION *func) { int changed; if (has_graph(func)) changed = reduce_graph(module, func, func->graph); else changed = reduce_block(module, func, tree_get_child(func, 0)); return changed; }
Node* mul_reduction (Node* node) { Node *aux, *mul, *mul_aux, *aux2; int n1, n2, res; char num1, num2; mul = (Node*) malloc(sizeof(Node)); mul_aux = (Node*) malloc(sizeof(Node)); aux = node; if (aux->right->type == 'n') n1 = aux->right->number; else{ aux2 = aux->right; do{ aux2 = reduce_graph(aux2, 1); } while(aux2->type != 'n'); n1 = aux2->number; } if (aux->left->right->type == 'n') n2 = aux->left->right->number; else{ aux2 = aux->left->right; do{ aux2 = reduce_graph(aux2, 1); } while(aux2->type != 'n'); n2 = aux2->number; } res = n1 * n2; mul_aux->type = 'n'; mul_aux->number = res; mul_aux->right = NULL; mul_aux->left = NULL; return mul_aux; }
Node* add_reduction (Node* node) { Node *aux, *sum, *sum_aux, *aux2; int n1, n2, res; char num1, num2, res_char; sum = (Node*) malloc(sizeof(Node)); sum_aux = (Node*) malloc(sizeof(Node)); aux = node; if (aux->right->type == 'n') n1 = aux->right->number; else{ aux2 = aux->right; do{ aux2 = reduce_graph(aux2, 1); } while(aux2->type != 'n'); n1 = aux2->number; } if (aux->left->right->type == 'n') n2 = aux->left->right->number; else{ aux2 = aux->left->right; do{ aux2 = reduce_graph(aux2, 1); } while(aux2->type != 'n'); n2 = aux2->number; } res = n1 + n2; sum_aux->type = 'n'; sum_aux->number = res; sum_aux->right = NULL; sum_aux->left = NULL; return sum_aux; }