bjs | J'ai modifié juste les printf en fprintf pour copier mon code assembleur généré dans un fichier que j'ai crée en .c et j'ai déclaré un pointeur de fichier en global.
Si tu as le temps tu peux jeter un coup d'oeil, mais je pense que ça marche car j'ai compilé, puis j'ai vu que ça chargeait bien le code assembleur dans le fichier.c que j'ai crée et puis j'ai recompilé et regardé en debogeur pour voir si ça mettait les bon calculs et ç'était ok.
Quelques messages avant celui ci tu m'a écrit : "Il y a plusieurs d'autres trucs dans ton code qu'on peut critiquer, mais je ne veux pas faire ton boulot."
Je voudrais savoir quelles choses sont pas bien dans mon code. Merci de me dire quoi. Je voudrais savoir aussi comment activer les warnings sur visual c++ 2010. J'ai déjà des warnings mais peut être qu'il y a un level supérieur en warnings ??
J'ai mis enable all warnings et ça me rien de spécial en warnings à par ce même warning pour toutes mes fonctions=>
1>f:\virton\bureau\micro quadri 2\ex1\ex1\exercice1.c(453): warning C4255: 'Nombre' : aucun prototype de fonction fourni : conversion de '()' en '(void)'
Code :
- //<blocvar> -> VAR<sdecl>FVAR
- //<sdecl> -> <decl> | <sdecle>,<decl>
- //<decl> -> i<chvar> = <nbrevar>
- //<nbrevar> -> <chvar> | <nbrevar><chvar>
- //<chvar> -> 0|1|2|3|4|5|6|7|8|9
- //<affectation> ? INSTR<sinstruction>SINSTR
- //<sinstruction> -> <intruction> | <sinstruction>,<instruction>
- //<instruction> -> i<chiffre> = <oulogique>
- //<oulogique> -> <etlogique>| <oulogique> | <etlogique>
- //<etlogique> -> <PlusMoins> | <etlogique> & <PlusMoins>
- // <plusmoins> ? <foisdiv> | <plusmoins> + <foisdiv> | <plusmoins> - <foisdiv>
- // <foisdiv> ? <opunaire> | <foisdiv> * <opunaire> | <foisdiv> / <opunaire>
- //<opunaire> -> <facteur> | - <facteur> | ~ <facteur> | + <facteur>
- // <facteur> ? <nombre> | ( <plusmoins> ) | i<chiffre>
- //<nombre>-> <nombredeci> | 0b<nombrebin> | 0x<nombrehexa>
- //<nombrehexa> -> <chiffrehexa> | <nombrehexa><chiffrehexa>
- //<chiffrehexa> -> 0|1|2|3/4/5/6/7/8/9/A/B/C/D/E/F
- // <nombredeci> -> <chiffredeci> | <nombredeci><chiffredeci>
- // <Chiffre> -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
- // <nombrebin> -> <chiffrebin> | <nombrebin><chiffrebin>
- //<chiffrebin> -> 0 | 1
- #include <stdio.h>
- #include <ctype.h>
- #include <string.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <stdlib.h>
- //#include <unistd.h>
- //#include "SortieErreur.h"
- void PlusMoins();
- void FoisDiv();
- void Facteur();
- void Nombre();
- int NombreDeci();
- int NombreBin();
- int ChiffreBin();
- int nombrehexa();
- int chiffrehexa();
- void CaractereSuivant();
- char CaractereCourant();
- void etlogique();
- void oulogique();
- void sinstruction();
- void instruction();
- void opunaire();
- void blocvar();
- void decl();
- void prog();
- int nbrevar();
- void sdecl();
- void affectation();
- char *acExpr ;
- int taillefichier=0;
- FILE* hfich=NULL;
- // "VAR i1=3,i3=8 SVAR INSTR i1=i1*2,i3=i1+i1 SINSTR";//code source dans fichier source
- // expression à compiler
- char bCourant = 0;
- int nbretourread=0;
- // indice du caractère courant dans l'expression
- void main()
- {
- FILE*hfF=NULL;
- if ((hfF = fopen("F:\\virton\\Bureau\\micro quadri 2\\ex1\\expression.txt","r+" )) == NULL) //"F:\\virton\\Bureau\\micro quadri 2\\compilateur\\compilateur\\expression.txt","r+" )) == NULL)
- {
- printf("(Fichier1) Err. d'ouverture du fichier" );
- exit(1) ;
- }
- fseek(hfF,0,SEEK_END);
- taillefichier= ftell(hfF)/sizeof(char);
- printf("//taillefichier=%d\n",taillefichier);
- acExpr= (char*) malloc (taillefichier+1);
- if(acExpr==NULL)
- {
- printf("Erreur d'allocation dynamique" );
- }
- fseek(hfF,0,SEEK_SET);
- nbretourread= fread(acExpr,taillefichier,1,hfF);
- acExpr[taillefichier]='\0';
- printf("//nbrretourread = %d\n",nbretourread);
- if (nbretourread != 1)
- { printf("(Fichier14t) Err. de lecture du fichier" );
- exit(1) ;
- }
- printf("//%s\n", &acExpr[0]);
- // démarrer la compilation
- //
- if ((hfich = fopen("F:\\virton\\Bureau\\micro quadri 2\\ex1\\fichier.c","w" )) == NULL) //"F:\\virton\\Bureau\\micro quadri 2\\compilateur\\compilateur\\expression.txt","r+" )) == NULL)
- {
- printf("(Fichier1) Err. d'ouverture du fichier" );
- exit(1) ;
- }
- blocvar();
- affectation();
- if (CaractereCourant() != 0)
- printf("Le caractere %c a la position %d dans %s est invalide!",
- acExpr[bCourant], bCourant + 1, acExpr);
- else
- printf("La compilation s'est bien deroulee!" );
- fclose(hfF);
- free(acExpr);
- acExpr=NULL;
- }
- //<blocvar> VAR<sdecl>FVAR
- void blocvar()
- {
- if (strncmp(&acExpr[bCourant], "VAR",3) == 0)
- {
- CaractereSuivant();
- CaractereSuivant();
- CaractereSuivant();
- sdecl();
- if (strncmp(&acExpr[bCourant], "SVAR",4) == 0)
- {
- CaractereSuivant();
- CaractereSuivant();
- CaractereSuivant();
- CaractereSuivant();
- }
- }
- }
- //<affectation> ? INSTR<sinstruction>SINSTR
- void affectation()
- {
- if (strncmp(&acExpr[bCourant], "INSTR", 5) == 0)
- {
- //printf("\nint main()\n{\n\t_asm\n\t{\n" );
- fprintf(hfich,"\nint main()\n{\n\t_asm\n\t{\n" );
- CaractereSuivant();
- CaractereSuivant();
- CaractereSuivant();
- CaractereSuivant();
- CaractereSuivant();
- sinstruction();
- if (strncmp(&acExpr[bCourant], "SINSTR", 6) == 0)
- {
- CaractereSuivant();
- CaractereSuivant();
- CaractereSuivant();
- CaractereSuivant();
- CaractereSuivant();
- CaractereSuivant();
- //printf("\n}\n}" );
- fprintf(hfich,"\n}\n}" );
- }
- }
- }
- //<sinstruction> -> <intruction> | <sinstruction>,<instruction>
- void sinstruction()
- {
- instruction();
- while ( CaractereCourant()== ',' )
- {
-
- CaractereSuivant();
- instruction();
- }
- }
- //<sdecl> -> <decl> | <sdecl>,<decl>
- void sdecl()
- {
- decl();
- while ( CaractereCourant()== ',' )
- {
-
- CaractereSuivant();
- decl();
- }
- }
- //<instruction> -> i<chiffre> = <oulogique>
- void instruction()
- {
- char nbre;
- if (CaractereCourant()== 'i')
- {
- CaractereSuivant();
- if(isdigit(CaractereCourant()))
- {
- //printf("\t\tpush i%d,eax\n", CaractereCourant());
- nbre=CaractereCourant();
- CaractereSuivant();
- if(CaractereCourant()=='=')
- {
- CaractereSuivant();
- oulogique();
- fprintf(hfich,"\t\tpop i%c\n",nbre);
- //printf("\t\tpop i%c\n",nbre);
- // printf("\t\tmov i%c,eax\n",nbre);
- //printf("push i1\npush 2\npop ebx\npop eax\nimul eax ebx \npush eax\n pop i1\n" );
-
- }
- }
- }
- }
- //<decl> -> i<chvar> = <nbrevar>
- void decl()
- {
- char nbre;
- if (CaractereCourant()== 'i')
- {
- //printf("int i" );
- fprintf(hfich,"int i" );
- CaractereSuivant();
- if(isdigit(CaractereCourant()))
- {
- nbre=CaractereCourant();
- //printf("%c ",nbre);
- fprintf(hfich,"%c ",nbre);
- CaractereSuivant();
- if(CaractereCourant()=='=')
- {
- CaractereSuivant();
- //printf("= %c;\n",CaractereCourant());
- fprintf(hfich,"= %c;\n",CaractereCourant());
- nbrevar();
-
- }
- }
- }
- }
- // Cette fonction prend en compte les règles de grammaire:
- //<opunaire> -> <facteur> | - <facteur> | ~ <facteur> | + <facteur>
- void opunaire()
- {
- switch(CaractereCourant())
- {
- case '~':
- CaractereSuivant();
- Facteur();
- // printf("pop eax\n" );
- // printf("not eax\n" );
- // printf("push eax\n" );
- fprintf(hfich,"pop eax\nnot eax\npush eax\n" );
- break;
- case '-':
- CaractereSuivant();
- Facteur();
- //printf("pop eax\n" );
- // printf("imul eax,-1\n" );
- // printf("push eax\n" );
- fprintf(hfich,"pop eax\nimul eax,-1\npush eax\n" );
- break;
- case '+':
- CaractereSuivant();
- Facteur();
- break;
- default:
- Facteur();
- break;
- }
-
- }
- // Cette fonction prend en compte les règles de grammaire:
- //<oulogique> -> <oulogique> | <etlogique>
- void oulogique()
- {
-
- etlogique();
- while ( CaractereCourant()== '|' )
- {
-
- CaractereSuivant();
- etlogique();
- // printf("pop ebx\n" );
- // printf("pop eax\n" );
- // printf("or eax, ebx\n" );
- // printf("push eax\n" );
- fprintf(hfich,"pop ebx\npop eax\nor eax, ebx\npush eax\n" );
- }
-
-
- }
- // Cette fonction prend en compte les règles de grammaire:
- //<etlogique> -> <etlogique> | <PlusMoins> & <PlusMoins>
- void etlogique()
- {
- PlusMoins();
- while( CaractereCourant()== '&' )
- {
- CaractereSuivant();
- PlusMoins();
- // printf("\tpop ebx\n" );
- // printf("\tpop eax\n" );
- // printf("\tand eax, ebx\n" );
- // printf("\tpush eax\n" );
- fprintf(hfich,"pop ebx\npop eax\and eax, ebx\npush eax\n" );
- }
- }
- // Cette fonction prend en compte les règles de grammaire:
- // <plusmoins> ? <foisdiv> | <plusmoins> + <foisdiv> | <plusmoins> - <foisdiv>
- void PlusMoins()
- {
- FoisDiv();
- while (CaractereCourant() == '+' || CaractereCourant() == '-')
- {
- switch(CaractereCourant())
- {
- case '+':
- CaractereSuivant();
- FoisDiv();
- // printf("pop ebx\n" );
- // printf("pop eax\n" );
- // printf("add eax, ebx\n" );
- // printf("push eax\n" );
- fprintf(hfich,"pop ebx\npop eax\nadd eax, ebx\npush eax\n" );
- break;
- case '-':
- CaractereSuivant();
- FoisDiv();
- // printf("pop ebx\n" );
- // printf("pop eax\n" );
- // printf("sub eax, ebx\n" );
- // printf("push eax\n" );
- fprintf(hfich,"pop ebx\npop eax\nsub eax, ebx\npush eax\n" );
- }
- }
- }
- // Cette fonction prend en compte les règles de grammaire:
- // <foisdiv> ? <opunaire> | <foisdiv> * <opunaire> | <foisdiv> / <opunaire>
- void FoisDiv()
- {
- opunaire();
- while (CaractereCourant() == '*' || CaractereCourant() == '/')
- {
- switch (CaractereCourant())
- {
- case '*':
- CaractereSuivant();
- opunaire();
- // printf("pop ebx\n" );
- // printf("pop eax\n" );
- // printf("imul eax, ebx\n" );
- // printf("push eax\n" );
- fprintf(hfich,"pop ebx\npop eax\nimul eax, ebx\npush eax\n" );
- break;
- case '/':
- CaractereSuivant();
- opunaire();
- // printf("pop ebx\n" );
- // printf("pop eax\n" );
- // printf("cdq\n" );
- // printf("idiv ebx\n" );
- // printf("push eax\n" );
- fprintf(hfich,"pop ebx\npop eax\ncdq\nidiv ebx\npush eax\n" );
- }
- }
- }
- // Cette fonction prend en compte les règles de grammaire:
- // <facteur> ? ( <plusmoins> ) | <nombre> | <nbrevar>
- void Facteur()
- {
- if (CaractereCourant() == '(')
- {
- CaractereSuivant();
- oulogique();
- if (CaractereCourant() == ')')
- CaractereSuivant();
- }
- else
- {
- if (CaractereCourant()== 'i')
- {
- CaractereSuivant();
- if(isdigit(CaractereCourant()))
- {
- //printf("push i%c\n", CaractereCourant());
- fprintf(hfich,"push i%c\n", CaractereCourant());
- CaractereSuivant();
- }
- }
- else
- Nombre();
- }
- }
- // Cette fonction prend en compte les règles de grammaire:
- // <nombre> -> <nombredeci> | 0b<nombrebin>
- void Nombre()
- {
- if(strncmp(&acExpr[bCourant], "0b", 2) == 0)
- {
- CaractereSuivant();
- CaractereSuivant();
- NombreBin();
- }
- if(strncmp(&acExpr[bCourant], "0x", 2) == 0)
- {
- CaractereSuivant();
- CaractereSuivant();
- nombrehexa();
- } else
- {
- NombreDeci();
- }
- }
- // Cette fonction prend en compte les règles de grammaire:
- // <nombredeci> -> <chiffredeci> | <nombredeci><chiffredeci>
- // <Chiffre> -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
- int NombreDeci()
- {
- int iVal = 0;
- if (isdigit(CaractereCourant()) != 0)
- {
- while (isdigit(CaractereCourant()) != 0)
- {
- iVal = (iVal * 10) + (CaractereCourant() - 0x30);
- CaractereSuivant();
- }
- //printf("push %d\n", iVal);
- // fprintf(hfich,"push %d\n", iVal);
- }
- return iVal;
- }
- //<nbrevar> -> <chvar> | <nbrevar><chvar>
- int nbrevar()
- {
- int iVal = 0;
- if (isdigit(CaractereCourant()) != 0)
- {
- while (isdigit(CaractereCourant()) != 0)
- {
- iVal = (iVal * 10) + (CaractereCourant() - 0x30);
- CaractereSuivant();
- }
- //printf("push %d\n", iVal);
- //fprintf(hfich,"push %d\n", iVal);
- }
- return iVal;
- }
- // Cette fonction prend en compte les règles de grammaire:
- // <nombrebin> -> <chiffrebin> | <nombrebin><chiffrebin>
- int NombreBin()
- {
- int iVal = 0;
- if (ChiffreBin() != 0)
- {
- while (ChiffreBin() != 0)
- {
- iVal = (iVal * 2) + (CaractereCourant() - 0x30);
- CaractereSuivant();
- }
- //printf("push %d\n", iVal);
- fprintf(hfich,"push %d\n", iVal);
- }
- return iVal;
- }
- // Cette fonction prend en compte les règles de grammaire:
- // <chiffrebin> -> 0 | 1
- int ChiffreBin()
- {
- if (CaractereCourant() == '0' || CaractereCourant() == '1')
- return 1;
- else return 0;
- }
- // Cette fonction prend en compte les règles de grammaire:
- //<chiffrehexa> -> 0|1|2|3/4/5/6/7/8/9/A/B/C/D/E/F
- int chiffrehexa()
- {
- if((CaractereCourant() >= '0' && CaractereCourant() <= '9')|| (CaractereCourant() >= 'A' && CaractereCourant() <= 'F'))
- return 1;
- else return 0;
- }
- // cette fonction prend en compte les règles de grammaire:
- //<nombre>-> <nombredeci> | 0b<nombrebin> | 0x<nombrehexa>
- //<nombrehexa> -> <chiffrehexa> | <nombrehexa><chiffrehexa>
- //<chiffrehexa> -> 0|1|2|3/4/5/6/7/8/9/A/B/C/D/E/F
- int nombrehexa()
- {
- int iVal=0;
- if(chiffrehexa() != 0)
- {
- while(chiffrehexa() != 0)
- {
- if(isdigit(CaractereCourant()))
- {
- iVal=(iVal*16)+(CaractereCourant()-0x30);
- CaractereSuivant();
- }
- else
- {
- iVal=(iVal*16)+(CaractereCourant()-55);
- CaractereSuivant();
- }
- }
- //printf("push %d\n", iVal);
- fprintf(hfich,"push %d\n", iVal);
- }
- return iVal;
- }
- // Cette fonction passe au caractère suivant dans l'expression
- void CaractereSuivant()
- {
- do
- bCourant++;
- while (acExpr[bCourant] == ' '); // éliminer les espaces
- }
- // Cette fonction retourne le caractère courant de l'expression
- char CaractereCourant()
- {
- return acExpr[bCourant];
- }
|
|