void comando(void) { atribuicao(); chamada_de_funcao2(); //Verificar a possibilidade de testar diretamente em comando...para evitar erros. comando_condicional(); comando_repetitivo(); //Verifica se o proximo token й GET if((tk.cat == PR) && (tk.p_reservada == GET)){ tk = analex(); //Verifica se o proximo token й '(' if((tk.cat == SN) && (tk.cod == OPP)){ tk = analex(); if(tk.cat == ID){ tk = analex(); if((tk.cat == SN) && (tk.cod == CLP)){ tk = analex(); if((tk.cat == SN) && (tk.cod == SMC)){ tk = analex(); comando(); } else erro(lin, 8); //Chama erro caso nгo venha ';' } else erro(lin, 3); //Chama erro caso nгo venha ')' } else erro(lin, 1); } else erro(lin, 2); } else if((tk.cat == PR) && (tk.p_reservada == PUT)){ tk = analex(); if((tk.cat == SN) && (tk.cod == OPP)){ tk = analex(); literal(); expressao_simples(); //Verifica se o proximo token й um ')' if((tk.cat == SN) && (tk.cod == CLP)){ tk = analex(); if((tk.cat == SN) && (tk.cod == SMC)){ tk = analex(); comando(); } else erro(lin, 8); //Chama erro caso nгo venha ';' } else erro(lin, 3); //Chama erro caso nгo venha ')' } else erro(lin, 2);//Chama erro caso nгo venha '(' }else if((tk.cat == SN) && (tk.cod == SMC)){ tk = analex(); comando(); } }
funcp compila (FILE *f) { funcp funcao; char cmd[4]; /* recebe comandos sb */ char varpc1[12]; /* 12 = número de digitos de maxint + '\n' + '$' */ char varpc2[12]; char op; /* recebe um operador */ int tpos; /* usado para voltar no vetor de char sem perder pos */ int n1, n2, n3; /* as linhas para onde se desvia o fluxo em um if */ int nlinhas; int retornoleitura; Intchar bvar; /* usado para calcular os bytes necessários para variaveis usadas */ int protelado; /* numero de if's protelados */ unsigned char *area = (unsigned char*) malloc(1300 * sizeof(unsigned char)); // 1300 = 50 * 26. 26 é o número de posições necessárias para a maior instrução, um if. 50 é o número máximo de linhas. for(nlinhas = 0; nlinhas < 20; nlinhas++) { alocada[nlinhas] = 0; } for(nlinhas = 0; nlinhas < 50; nlinhas++) { ses[nlinhas] = -1; } pos = 0; nlinhas = 0; protelado = 0; retornoleitura = fscanf(f, "%s", cmd); area[0] = 0x55; /* pushq %rbp */ area[1] = 0x48; /* movq %rsp, %rbp */ area[2] = 0x89; area[3] = 0xe5; /* */ area[4] = 0x48; /* sub $x, %rsp */ area[5] = 0x83; area[6] = 0xec; area[7] = 0x00; /* será mudado depois para o valor correto conforme o numero de variaveis usadas */ pos += 8; while(retornoleitura != EOF && nlinhas <= 50){ switch(cmd[0]){ case 'r': /* retorno */ posdalinha[nlinhas] = pos; fscanf(f, "%s", varpc1); retorno(varpc1, area); nlinhas++; break; case 'v': /* atribuição */ posdalinha[nlinhas] = pos; fscanf(f, "%s", varpc1); /* lê o '=' */ fscanf(f, "%s %c %s", varpc1, &op, varpc2); atribuicao(cmd, varpc1, op, varpc2, area); nlinhas++; break; case 'i': /* if */ posdalinha[nlinhas] = pos; ses[protelado] = pos; fscanf(f, "%s %d %d %d", varpc1, &n1, &n2, &n3); pos += 26; /* tamanho do comando if */ protelado++; nlinhas++; break; default: /* comando não reconhecido */ printf("Comando não reconhecido %s na linha %d \n", cmd, nlinhas); } retornoleitura = fscanf(f, "%s", cmd); } rewind(f); fscanf(f, "%s", cmd); protelado = 0; while(ses[protelado] != -1){ while(cmd[0] != 'i'){ fscanf(f, "%s", cmd); } fscanf(f, "%s %d %d %d", varpc1, &n1, &n2, &n3); fscanf(f, "%s", cmd); tpos = ses[protelado]; protelado++; se(varpc1, n1, n2, n3, area, tpos); } // corrige o sub $0, %rsp for(bvar.i = 20; bvar.i > 0 && alocada[bvar.i] != 1; bvar.i = bvar.i - 1){ } bvar.i = bvar.i * 4; while(bvar.i % 16 != 0){ bvar.i = bvar.i + 4; } area[7] = bvar.c[0]; //**** area = realloc(area, (pos-1)*sizeof(unsigned char)); /* muda o tamanho da memoria alocada para o tamanho necessário */ funcao = (funcp)area; return funcao; }