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