En fait j'ai 2 problèmes dont les solutions pourront me permettre de comprendre mieux mon cours de compilation:
Le premier est celui ci:
J'aimerai écrire un programme C qui me permet de retrouver la représentation fonctionnelle d'un arbre abstrait:
1- à partir de sa représentation préfixée d'une part,
2 - et de sa représentation postfixée d'autre part,
3 - en fin de sa représentation infixée.
Le deuxième est le suivant:
Je voudrais construire un compilateur pour un langage C simplifié dont la grammaire est :
CHIFFRE -> 0|1|3|4|5|6|7|8|9
LETTRE -> a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
IDENT -> LETTRE|LETTRE IDENT
NOMBRE -> CHIFFRE|CHIFFRE NOMBRE
REEL -> NOMBRE
DECLARATION -> TYPE ESPACE LISTE SEPFIN
TYPE -> int|float
LISTE -> id,LISTE|id
SEPFIN -> ;
INSTRUCTION -> DECLARATION|AFFECTATION
AFFECTATION -> IDENT OPAF EXPRESSION SEPFIN
EXPRESSION à EXPRESSION OPADD EXP1|EXP1
OPADD -> +|-
EXP1 -> EXP1 OPMUL TERME|TERME
OPMUL -> *|/
OPAF -> =
TERME -> ‘(‘ EXPRESSION ‘)’ | IDENT | NOMBRE
RESERVES -> main|int|float
PROGRAMME -> main { LISTEINS }
LISTEINS -> INSTRUCTION LISTEINS | INSTRUCTION
Ce langage permet de déclarer des variables et de réaliser des opérations arithmétiques sur ces variables. On suppose qu’une opération arithmétique ne se réalise que si les deux opérandes sont de même type et qu’il n’y a pas d’opérations unaires. Une instruction ne peut pas tenir plusieurs lignes.
J'aimerai écrire en c pour ce langage :
- Un analyseur lexical ;
- Un analyseur syntaxique produisant en sortie l’arbre abstrait du programme ;
- Un analyseur sémantique qui parcoure l’arbre abstrait et vérifie la sémantique du programme, en ajoutant éventuellement des informations dans la table des symboles.
En faisant ressortir dans les codes toutes les procédures de manipulations de la table des symboles.
Si tu ne peux pas lui donner un coup de pouce tu la ferme carrement.
Nous ne somme pas dans une salle de classe ou dans un amphi théatre.
J'ai par exemple dans mon environnement plein de très bon programmeurs qui ont apris par cette méthode là. Et qui n'ont jamais eu de prof en présentiel.
Tu crois que c'est la formule de la bombe atomique que tu vas lui fournir.
Je sui un programmeur en java et je suis pret à lui fournir le code d'ici une semaine s'il peut le traduire ec.
je suis programmeur java aussi depuis plus de 10 ans...
et j'en ai marre de devoir bosser avec des programmeur "copier/coller" ...
alors si tu veux te taper le boulot des autres c'est ton problème .. En attendant, ils toucheront leurs salaires quand même quand ils seront embauchés pour "leurs bons résultats", même si des "bonnes âmes comme toi" le font à leur place... alors regarde un peu plus loin que ton nez le moraliste...
Pour être complet, il faut souligner que "Alois"=="Malaba"=="gdavis"
!!!!!!!!!!!!!!! "pourront me permettre de comprendre mieux mon cours de compilation:" <==> "j'ai cessé de m'assoir dans un amphi il y a plus de 13 ans ajourdhui. " !!!!!!!!!!!!!
Pour le reste, voir réponse < 2 > de Lami20j ci-dessous.
Je télécharge plein de contenu(cours) gratuit en ligne et je travaille avec en autodidacte.
Bien sur avec l'assistance de plein d'internautes comme lami 20j qui n'a pas ce temps de à perdre derrière des polémiques inutiles .
"Pourquoi tant de polémique autour de mon sujet. " : peut-être parce qu'il était formulé d'une façon qui prête le flanc à la polémique, sans doute ....
Et que prendre trois pseudos différents pour tenter de faire avancer le dossier par "effet de masse" n'est pas vraiment de nature à nous rendre totalement amènes.
Bonjour et merci à tous ceux qui me sont venu en aide jusqu'ici.
J'ai pu trouvé une solution à mon premier prob précédemment posé.
J'aimerai effectuer l'opération inverse.
C'est à dire
Un programme qui lit une expression sous la forme fonctionnelle et
affiche sa forme préfixée et sa forme post fixée
En fait: voici mon programme.
Les parties marquée en gras me donnent encore des maux de tête
Dans le main
l'appel des fonction,
- saisie_fonctionnelle(deb, y)
- affichage_prefixe(y)
- affichage_postfixe(y)
présentent des erreurs suivant:
- suspicious pointer conversion in function ...
- possible use of 'deb' before definition function
- possible use of 'y' before definition function
/* PROGRAMME PERMETTANT DE LIRE UNE EXPRESSION SOUS LA FORME FONCTIONNELLE */
/* ET AFFICHE SA REPRESENTATION SOUS LA FORME PREFIXEE D4UNE PART */
/* ET SOUS LA FORME POSTFIXEE D4AUTRE PART */
/* Les composantes de l'arbre seront donc soit des opérateurs (noeuds),*/
/* soit des opérandes (feuilles). Nous allons choisir les déclarations suivantes :*/
printf ("Saisie une expression fonctionnelle \n ");
do
{
c; }
while (deb == '&');
/* Affichage de la forme préfixée */
printf ("La representation préfixée est : ");
affiche_prefixe(y);
/* Affichage de la forme prostfixée */
printf ("La représentation postfixée est : ");
affiche_postfixe(y);
return 0;
}
/* Fonction créant l'arbre à partir d'une chaîne de caractères préalablement saisie.*/
/* de l'expression fonctionnelle*/
/* Les opérateurs possibles sont +,-,*,/(deuxaires), C,S(cos,sin,unaires).*/
/* Les caractères '(', ')' et ',' sont des séparateurs */
/* Un nombre commence par un chiffre (exemple 0.7 au lieu de .7). */
/* deb pointe sur le début de chaîne, il pointera ensuite sur le reste de la chaîne */
/* (pas encore traitée) donc passage par adresse d'un pointeur */
lien saisie_fonctionnelle(char **deb, lien x)
{
printf("entrez opérandes (nombres) et opérateurs (+,-,*,/,C (cos),S)\n");
printf("séparés par parenthèses ouvrantes, fermantes ou des virgules \n");
printf(" \n");
while(**deb=='('||**deb==')'||**deb==',') (*deb)++;
if(**deb==0) /* on est arrivé en fin de chaîne */
{puts("erreur : Il doit manquer des opérandes");
return(NULL);}
x=(composante*)malloc(sizeof(composante));
if(isdigit(**deb))
{
x->arite=0;
sscanf(*deb,"%f",&(x->val.f));
while(isdigit(**deb)||**deb=='.') (*deb)++;
}
else
{
char c;
c=toupper(*((*deb)++));
if(c=='*'||c=='/'||c=='+'||c=='-')
{
x->arite=2;
x->val.n2.op_c=c;
x->val.n2.fils1=saisie_fonctionnelle(deb,x);
x->val.n2.fils2=saisie_fonctionnelle(deb,x);
}
else if(c=='C'||c=='S')
{
x->arite=1;
x->val.n1.op_c=c;
x->val.n1.fils=saisie_fonctionnelle(deb,x);
}
else printf("erreur, '%c'n'est pas un opérateur prévu\n",c);
}
return(x);
}
/* Utilisation de l'arbre pour afficher sa représentation fonctionnelle. */
/* On affiche la valeur du noeud puis le fils gauche et le fils droit séparé*/
/* par une virgule et tous deux entre parenthèse. */
void affiche_prefixe(lien x)
{
switch(x->arite)
{
case 0:printf("%6.1f ",x->val.f);break;
case 1:printf(" %C ",x->val.n1.op_c);
affiche_prefixe(x->val.n1.fils);
break;
case 2:printf(" %c ",x->val.n2.op_c);
affiche_prefixe(x->val.n2.fils1);
affiche_prefixe(x->val.n2.fils2);
break;
}
}
void affiche_postfixe(lien x)
{
switch(x->arite)
{
case 0:printf("%6.1f ",x->val.f);break;
case 1:affiche_postfixe(x->val.n1.fils);
printf(" %C ",x->val.n1.op_c);
break;
case 2:affiche_postfixe(x->val.n2.fils1);
affiche_postfixe(x->val.n2.fils2);
printf(" %c ",x->val.n2.op_c);
}
}
ON BOSSE.
!!!!!!!!!!!!!!! "pourront me permettre de comprendre mieux mon cours de compilation:" <==> "j'ai cessé de m'assoir dans un amphi il y a plus de 13 ans ajourdhui. " !!!!!!!!!!!!!
Pour le reste, voir réponse < 2 > de Lami20j ci-dessous.
Pourquoi tant de polémique autour de mon sujet.
Je télécharge plein de contenu(cours) gratuit en ligne et je travaille avec en autodidacte.
Bien sur avec l'assistance de plein d'internautes comme lami 20j qui n'a pas ce temps de à perdre derrière des polémiques inutiles .
Nous sommes au 21ème siècle.
Bonne journée
Et que prendre trois pseudos différents pour tenter de faire avancer le dossier par "effet de masse" n'est pas vraiment de nature à nous rendre totalement amènes.