コード例 #1
0
ファイル: parcours.c プロジェクト: Xawirses/compilateur-l
/*-------------------------------------------------------------------------*/
void parcours_var_simple(n_var *n, char * var)
{
  int i = rechercheExecutable(n->nom);
  if( i < 0) {
    printf("Variable %s non déclaré\n", n->nom);
    affiche_dico();
    exit(1);
  } else if (dico.tab[i].type == T_TABLEAU_ENTIER) {
    printf("Indice tableau %s est attendu\n", n->nom);
    affiche_dico();
    exit(1);
  }

  if(dico.tab[i].classe == C_VARIABLE_GLOBALE) {
    sprintf(var, "$%s", n->nom);
  } 
  else if (dico.tab[i].classe == C_ARGUMENT) {    
    int adress = dico.tab[i].adresse;
    int result = 4 * nbArg  - adress;
    sprintf(var, "%d($fp) #variable argument %s",result,n->nom);
  }
  else if (dico.tab[i].classe == C_VARIABLE_LOCALE){
    int adresse = -1 *(8 + dico.tab[i].adresse);
    sprintf(var, "%d($fp) #variable locale", adresse);
  }
}
コード例 #2
0
ファイル: parcours.c プロジェクト: Xawirses/compilateur-l
void parcours_appel(n_appel *n)
{
  char tmp[250];

  int id = rechercheExecutable(n->fonction);
  if(id < 0) {
    printf("Fonction %s introuvable\n", n->fonction);
    affiche_dico();
    exit(1);
  }

  printMips("subi $sp, $sp, 4 #Val Retour");

  int nbArg = parcours_l_exp(n->args);


  if(dico.tab[id].complement != nbArg) {
    printf("Nombre Argument différent pour l'appel à %s\n", n->fonction);
    affiche_dico();
    exit(1);
  }

  sprintf(tmp,"jal %s",n->fonction);
  printMips(tmp);
  int i = nbArg * 4;
  if(i != 0) {
    sprintf(tmp,"addi $sp, $sp, %d #désalocation des arguments",i);
    printMips(tmp);
  }
}
コード例 #3
0
void mips_gen_inst_affect_tab(const n_var* v){
    //Charge indice
    mips_gen_pop_reg("$t0");
    
    //Indice x4
    mips_gen_instr_3("add", "$t0", "$t0", "$t0");
    mips_gen_instr_3("add", "$t0", "$t0", "$t0");
    
    mips_gen_pop_reg("$t1");
    
    char* nom = v->nom;
    
    int i = rechercheExecutable(nom);
    
    if(i == -1)
        erreur_1s("MIPS: Variable %s introuvable", nom);
    
    switch(dico.tab[i].classe){
        case C_VARIABLE_GLOBALE:
            printf("\tsw	$t1, %s($t0)		 # stocke variable\n", nom);
            break;
        default:
            erreur_1s("MIPS: tableau %s Portée invalide", nom);
    }
}
コード例 #4
0
ファイル: parcours.c プロジェクト: Xawirses/compilateur-l
void parcours_foncDec(n_dec *n)
{
  char tmp[256];
  sprintf(tmp, "%s :", n->nom);
  printMips(tmp);
  debutFunc();

  int i = rechercheExecutable(n->nom);
  if( i >= 0) {
    printf("Fonction %s déjà déclaré\n", n->nom);
    affiche_dico();
    exit(1);
  }

  int id = ajouteIdentificateur(n->nom,  contexte, T_FONCTION, 0, -1);
  entreeFonction();
  contexte = C_ARGUMENT;
  parcours_l_dec(n->u.foncDec_.param);

  int j = 0;
  for(int i = dico.sommet - 1; i >= 0; i--){
    if(dico.tab[i].classe != C_ARGUMENT)
      break;
    j++;
  }
  nbArg = j;
  i = id;
  int nbvariableLocale = 0;
  
  
  dico.tab[id].complement = j;

  contexte = C_VARIABLE_LOCALE;
  parcours_l_dec(n->u.foncDec_.variables);
  while (i+1 < dico.sommet && (dico.tab[i+1].classe == C_VARIABLE_LOCALE 
    || dico.tab[i+1].classe == C_ARGUMENT)){
    if(dico.tab[i+1].classe == C_VARIABLE_LOCALE)
      ++nbvariableLocale;
    ++i;
  }
  nbvariableLocalFonc = nbvariableLocale;

  parcours_instr(n->u.foncDec_.corps);
  sprintf(tmp,"addi $sp, $sp %d # desallocation variables locales",nbvariableLocale * 4);

  printMips(tmp);

  affiche_dico();
  sortieFonction();
  finFunc();
}
コード例 #5
0
ファイル: parcours.c プロジェクト: Xawirses/compilateur-l
/*-------------------------------------------------------------------------*/
void parcours_var_indicee(n_var *n, char * var)
{
  int i = rechercheExecutable(n->nom);
  if( i < 0) {
    printf("Tableau %s non déclaré\n", n->nom);
    affiche_dico();
    exit(1);
  } else if (dico.tab[i].type == T_ENTIER) {
    printf("%s n'est pas un Tableau\n", n->nom);
    affiche_dico();
    exit(1);
  }
  parcours_exp( n->u.indicee_.indice );
  depile ("$t4");
  printMips("add $t4,$t4,$t4");
  printMips("add $t4,$t4,$t4");
  sprintf(var,"$%s($t4)",n->nom);
}
コード例 #6
0
ファイル: parcours.c プロジェクト: Xawirses/compilateur-l
void parcours_table(n_prog *n)
{
  printMips(".data");
  parcours_l_dec(n->variables);
  printMips(".text");
  printMips("__start:");
  printMips("jal main");
  printMips("li $v0, 10");
  printMips("syscall");

  parcours_l_dec(n->fonctions); 

  int id = rechercheExecutable("main");
  if(id < 0 || dico.tab[id].complement != 0) {
    printf("Fonction main non trouvé\n");
    affiche_dico();
    exit(1);
  }
}
コード例 #7
0
void mips_gen_inst_affect(const n_var* v){
    mips_gen_pop_reg("$t1");
    
    char* nom = v->nom;
    
    int i = rechercheExecutable(nom);
    
    if(i == -1)
        erreur_1s("MIPS: Variable %s introuvable", nom);
    
    switch(dico.tab[i].classe){
        case C_VARIABLE_GLOBALE:
            printf("\tsw	$t1, %s		 # stocke variable\n", nom);
            break;
        case C_VARIABLE_LOCALE:
            printf("\tsw\t$t1, -%d($fp)		 # stocke variable\n", dico.tab[i].adresse + 8); //8 = $fp + $ra
            break;
        default:
            erreur_1s("MIPS: %s Portée invalide", nom);
    }
}
コード例 #8
0
void mips_gen_exp_var(const n_exp* exp){
    char* nom = exp->u.var->nom;
    
    int i = rechercheExecutable(nom);
    
    if(i == -1)
        erreur_1s("MIPS: Variable %s introuvable", nom);
    
    switch(dico.tab[i].classe){
        case C_VARIABLE_GLOBALE:
            printf("\tlw	$t1, %s		 # lit variable dans $t1\n", exp->u.var->nom);
            break;
        case C_ARGUMENT:
            printf("\tlw	$t1, %d($fp)		 # lit variable dans $t1\n", (adresseArgumentCourant - dico.tab[i].adresse));
            break;
        case C_VARIABLE_LOCALE:
            printf("\tlw	$t1, -%d($fp)		 # lit variable dans $t1\n", (dico.tab[i].adresse + 8));
            break;
        default:
            erreur_1s("MIPS: exp_var : %s Portée invalide", nom);
    }
    mips_gen_stack_reg("$t1");
}
コード例 #9
0
void mips_gen_exp_var_tab(const n_var* var){
    mips_gen_pop_reg("$t0");
    
    //$t0 * 4
    mips_gen_instr_3("add", "$t0", "$t0", "$t0");
    mips_gen_instr_3("add", "$t0", "$t0", "$t0");
    
    char* nom = var->nom;
    
    int i = rechercheExecutable(nom);
    
    if(i == -1)
        erreur_1s("MIPS: Variable %s introuvable", nom);
    
    switch(dico.tab[i].classe){
        case C_VARIABLE_GLOBALE:
            printf("\tlw	$t1, %s($t0)		 # lit variable dans $t1\n", var->nom);
            break;
        default:
            erreur_1s("MIPS: exp_var_tab : %s Portée invalide", nom);
    }
    
    mips_gen_stack_reg("$t1");
}