Sos programmation en c

Fermé
gdavis Messages postés 4 Date d'inscription samedi 7 juin 2008 Statut Membre Dernière intervention 13 juin 2008 - 7 juin 2008 à 19:16
 gdavis - 23 juin 2008 à 20:21
Bonjour à tous.

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.


Merci d'avance.
A voir également:

5 réponses

choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100
7 juin 2008 à 19:18
Salut

en gros, tu veux qu'on fasse tes devoirs ...

sale période pour les forums d'entraide
0
Choubaka bonsoir.

Tu joues au moraliste!

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.

ON NE RECONSTRUIT pAS LE MONDE.

Good afternoon.
0
choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100 > Aloïs
19 juin 2008 à 22:33
alois bonsoir

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...

c'est quoi ces zozos...

nan mais ho !
0
Serge Messages postés 24567 Date d'inscription mardi 30 novembre 1999 Statut Modérateur Dernière intervention 16 décembre 2016 208 > choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024
19 juin 2008 à 22:50
c'est quoi ces zozos...

des feignasses ?!
0
Malaba > Serge Messages postés 24567 Date d'inscription mardi 30 novembre 1999 Statut Modérateur Dernière intervention 16 décembre 2016
20 juin 2008 à 10:00
Bonjour à tous.

C'est vraiment de la dérive qui veut s'installer là.

Ou vous assistez ou vous passez à autres choses.
Il ya trop à faire encore dans ce monde.

un seul mot:
ne perdez pas votre temps à juger les autres.

Et surtout ici c'est zéro salaire.

Je suis un partisant du libre.

A+
0
Aloïs > choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024
20 juin 2008 à 10:03
SHUT!!!

ON BOSSE.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
7 juin 2008 à 19:30
Salut,

un p'tit coup de pouce

pour le reste bon courage ;-)
0
choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100
7 juin 2008 à 20:11
0
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 */

#include <stdio.h>
#include<stdlib.h>
#include<alloc.h>


/* Les composantes de l'arbre seront donc soit des opérateurs (noeuds),*/
/* soit des opérandes (feuilles). Nous allons choisir les déclarations suivantes :*/


typedef float type_feuille;
typedef struct s_noeud_2
{char op_c;
struct s_comp*fils1;
struct s_comp*fils2;
}type_noeud_2;

typedef struct s_noeud_1
{char op_c;
struct s_comp*fils;
}type_noeud_1;

typedef struct s_comp
{int arite;
union
{type_noeud_2 n2;
type_noeud_1 n1;
type_feuille f;
}val;
}composante;

typedef composante *lien;


lien saisie_fonctionnelle(char **deb, lien x);
void affiche_prefixe(lien x);
void affiche_postfixe(lien x);

type_noeud_2 *alloc();


/* PARTIE PRINCIPALE */

main ()

{

type_noeud_2 *deb;
lien y;

/*deb = NULL; /*

printf ("ENTRER L'EXPRESION FONCTIONNELLE \n");
printf (" \n");


/* Saisie de l'expression fonctionnelle */


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);
}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bsoir.

C'est cette partie principale qui dérange mon compilateur.

/* PARTIE PRINCIPALE */

main ()

{

type_noeud_2 *deb;
lien y;

/*deb = NULL; /*

printf ("ENTRER L'EXPRESION FONCTIONNELLE \n");
printf (" \n");


/* Saisie de l'expression fonctionnelle */


printf ("Saisie une expression fonctionnelle \n ");

do
{
lien saisie_fonctionnelle(deb, y); ;
}
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;
}

Certainement je ne sais pas encore faire les appels corrects de fonction en c.

Je rampe encore en c. C'est pas bon.

A+
0