Sos programmation en c [Fermé]

Signaler
Messages postés
4
Date d'inscription
samedi 7 juin 2008
Statut
Membre
Dernière intervention
13 juin 2008
-
 gdavis -
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.

5 réponses

Messages postés
37915
Date d'inscription
jeudi 4 avril 2002
Statut
Modérateur
Dernière intervention
31 décembre 2019
1 715
Salut

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

sale période pour les forums d'entraide
> choubaka
Messages postés
37915
Date d'inscription
jeudi 4 avril 2002
Statut
Modérateur
Dernière intervention
31 décembre 2019

SHUT!!!

ON BOSSE.
BmV
Messages postés
76798
Date d'inscription
samedi 24 août 2002
Statut
Modérateur
Dernière intervention
23 janvier 2020
3 994
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.
> BmV
Messages postés
76798
Date d'inscription
samedi 24 août 2002
Statut
Modérateur
Dernière intervention
23 janvier 2020

BMV salut,

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
BmV
Messages postés
76798
Date d'inscription
samedi 24 août 2002
Statut
Modérateur
Dernière intervention
23 janvier 2020
3 994 > gdavis
"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.

> BmV
Messages postés
76798
Date d'inscription
samedi 24 août 2002
Statut
Modérateur
Dernière intervention
23 janvier 2020

????????????????????
Messages postés
21511
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 426
Salut,

un p'tit coup de pouce

pour le reste bon courage ;-)
Messages postés
37915
Date d'inscription
jeudi 4 avril 2002
Statut
Modérateur
Dernière intervention
31 décembre 2019
1 715
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);
}
}
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+