Signaler

Programmer l'analyse lexicale [Résolu]

Posez votre question Ouldmeamina 2Messages postés mardi 18 octobre 2016Date d'inscription 19 octobre 2016 Dernière intervention - Dernière réponse le 19 oct. 2016 à 21:12
Aidé moi stp

Programmer l'analyse lexicale du langage prolog en utilisant le langage de programmation c++
de créer des fichier contenant des exemple de programme écrits en prolog .
Le code source de l'analyse.

#include<stdio.h>
#include<stdlib.h>
#include<cstdio>
#include<iostream>


int main (){
 
 FILE *fichier = NULL;
 char x;
 char text[21];
 int i=0,j=0,n=0,m=0;
 char predicat[20];
 char id1[20];
 char id2[20];
 char sep1,sep2,sep3,sep4; 
 int etat=1;
 
 
 fichier=fopen("prog.txt","r");
 if (fichier==NULL){
 printf ("ERRREUR");  
  
 }else {
 fgets(text,sizeof text , fichier);
 printf ("En lecture\n");
 printf ("%s\n",text);
 }
 for (i=0;i<sizeof(text);i++){
 x=text[i];
  if (text[i]=='.'){
   etat=5;
  } else if(text[i]=='('){
   etat=2;
  } else if(text[i]==','){
   etat=3;
  } else if(text[i]==')'){
   etat=4;
  } else {
   if (etat==1){
    predicat[j]=predicat[j]+text[i];
    j++;
   } else if(etat==2){
    id1[n]=id1[n]+text[i];
    n++;
   } else if(etat==3){
    id2[m]=id2[m]+text[i];
    m++;
   }
   
  }
 }

 printf ("\nLe predicat est : ");
 
 for (i=0;i<sizeof(predicat);i++)
 printf ("%c",predicat[i]);
 
 printf ("\nL'identificateur 1 est : ");
 for (i=0;i<sizeof(predicat);i++)
 printf ("%c",id1[i]);
 
 printf ("\nL'identificateur 2 est : ");
 for (i=0;i<sizeof(predicat);i++)
 printf ("%c",id2[i]);

 printf ("\n");

Mais mon code ne marché pas bien j'ai un problèmes au niveau des boucle

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 
Utile
+0
moins plus
Bonjour,

Ce code est du C pas du C++! C'est même du C de très bas niveau!
Quand tu fais predicat[j]=predicat[j]+text[i]; (en C ou en C++), que penses-tu faire?
predicat étant non initialisé, tu dis que la j-ième lettre est un nombre aléatoire auquel tu ajoutes le caractère lu.
Un correctif (en langage C) pourrait-être
predicat[j]=text[i];
predicat[++j] = '\0'; // et terminer la chaîne

En C++, il existe des possibilités beaucoup plus simples. predicat étant alors un std::string et surtout pas un tableau de char.
Ouldmeamina 2Messages postés mardi 18 octobre 2016Date d'inscription 19 octobre 2016 Dernière intervention - 19 oct. 2016 à 21:12
Merci pour votre réponse mais j'ai complimente mon code avec predicat[j]=text[i];
predicat[++j] = '\0'; // et terminer la chaîne mais en exécution j'ai que des symbole indéfini aide moi stp
Répondre
Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !