IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Coincé entre le C et le C++


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut Coincé entre le C et le C++
    Bonjour,

    Dans le cadre d'un projet scolaire je dois réaliser un compilateur d'algorithme. Et arrivé à la fin j'ai un gros souci.

    Toute la partie IHM est en C++ (avec Qt), mais la personne chargée de la partie compilation (juste le début hein - une analyse lexicale et syntaxique-) à tout fait en C. Et là comme on pouvait s'y attendre on est bien embêté pour tout regrouper.

    Au debut on avait pensé à faire générer du code C++ à flex et yacc, mais c'est vraiment trop dur pour le peu de temps qu'il nous reste.

    Alors on a pensé à une solution. Pouquoi ne pas creer une librairie de notre parser et y adjointre une fontion analyzer dont le protype serait un truc du genre

    char * analyzer (const char *);

    cette fonction recoit comme paramètre le texte à compiler, et renvoie une chaine de caractère qui contient les erreurs. On pourrait alors appeler cette fonction à partir d'une classe C++.

    A votre avis cette solution est'elle viable (c'est la première fois qu'on va faire une librairie).

    Aussi on en a un peut marre d'utiliser les char* maintenant qu'on a gouté au aux string, on en a un peu marre aussi des fopen et compagnie, y aurait il une lib en C qui facilite les travail sur chaine de caractères et fichiers.

    Merci

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par exhortae Voir le message
    Dans le cadre d'un projet scolaire je dois réaliser un compilateur d'algorithme
    J'ai l'air bête, mais qu'est-ce qu'un compilateur d'algorithme?

    Pour te faciliter les chaines en C, tu as la GLib ou alors la bibliothèque CStr écrite par Franck Hecht: http://franckh.developpez.com/cstr/

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    J'ai l'air bête, mais qu'est-ce qu'un compilateur d'algorithme?

    Pour te faciliter les chaines en C, tu as la GLib ou alors la bibliothèque CStr écrite par Franck Hecht: http://franckh.developpez.com/cstr/

    Thierry
    Merci pour les liens.

    Pour le compilateur d'algorithme (enfin le début, le projet s'étale sur plusieurs années) c'est pouvoir obtenir à partir d'un code source sous la forme algorithmique un code cible binaire

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    C'est quoi un code source sous la forme algorithmique? Du pseudo code? Il s'agit donc d'un compilateur un langage dont vous avez défini la grammaire en code machine. C'est assez peu courant de faire ce genre de projet en C ou en C++ dans les Fac. Les langages fonctionnels sont maintenant à la mode dans ce domaine. A l'Ecole Polytechnique Fédérale de Lausanne, on utilisait Scala. J'ai également entendu parler de l'utilisation de OCaml ou Haskell.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Voir l'image en pièce jointe pour voir le projet avec un example de code (très proche du pascal), c'est le code algorithmique utilisé en 1ère année à l'école.

    Dison que le projet à la base a été choisi pour appliquer ce qu'on apprend en théorie des langages et compilation au cours de l'année. L'IHM a été faites avec Qt pour la simple raison qu'on apprend le C++ ce semestre.

    En faite ce projet sera probablement abandonné par la suite, vu que certain d'entre nous vont choisir l'option réseau, et que perso je me dirige plus vers le .NET et les bases de données
    Images attachées Images attachées  

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par exhortae
    Toute la partie IHM est en C++ (...), mais la personne chargée de la partie compilation (...) a tout fait en C.
    C'est une chose assez courante. Tu aurais pu faire l'IHM en Delphi ou en VB, ça ne change rien.

    Pour appeler une fonction écrite en C depuis C++, il suffit de déclarer la fonction en la faisant précéder de extern "C". Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    extern "C" int f(void);
    extern "C" int g(void);
    Ou tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    extern "C" {
        int f(void);
        int g(void);
    }
    C'est la même technique utilisée pour rendre une fonction C++ utilisable depuis C.

    Pour utiliser un objet C++ depuis un programme en C, il faut fournir une interface C des méthodes de l'objet en question. L'écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X.f(); /* Ou X est un objet C++ */
    N'est pas possible en C. Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x_f(); /* x_f est une fonction qui appelle X.f() */
    Est possible. Autrement dit, il suffit d'encapsuler l'appel X.f() dans une fonction utilisable en C (aussi bien en C qu'en C++ ...).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Dans le fichier d'en-tete
    extern "C" void x_f(void);
     
    // Code C++
    void x_f(void) {
        X.f();
    }

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Bonjour,

    sur tes conseil j'ai testé sur des fichiers 1.l et 1.y (lex et yacc) de la manière suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    %{
     
    #include <iostream>
     
    #include "y.tab.h"
     
    using namespace std;
     
    %}
     
    %%
     
    "SLD"		{ return(NOM); }
     
    "MANGE"		{ return(VERBE); }
     
    [\n \t]		{ ; }
     
    .			{ exit(0); }
     
    %%
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    %{
     
    #include <iostream>
     
    extern "C"
    {
            int yyparse(void);
            int yylex(void); 
            void yyerror(char *); 
    }
     
    using namespace std;
    %}
     
    %token NOM VERBE
     
    %%
     
    phrase : NOM VERBE NOM { cout << "Phrase correcte" << endl; }
     
    %%
     
    extern FILE *yyin;
     
    int main()
    {
    	yyin = stdin;
     
    	while (!feof(yyin))
    	{
    		yyparse();
    	}
     
    	return EXIT_SUCCESS;
    }
     
    yyerror(s)
    char *s;
    {
    	cout << "Erreur syntaxique" << endl;
    	exit(0);
    }
    Mais j'ai toujours des erreurs de compilation avec g++.


    C:\compiler\1>g++ lex.yy.c y.tab.c -lfl
    1.y:37: error: expected constructor, destructor, or type conversion before '(' t
    oken
    1.y:37: error: expected `,' or `;' before '(' token
    1.y:39: error: expected unqualified-id before '{' token
    1.y:39: error: expected `,' or `;' before '{' token

    C:\compiler\1>


    il doit y avoir quelquechose dans le .y qui marche pas avec g++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Différence entre un "bidouilleur" et un Pro ?
    Par christ_mallet dans le forum Débats sur le développement - Le Best Of
    Réponses: 290
    Dernier message: 28/11/2011, 10h53
  2. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 20h09
  3. [réseaux] Bench en Perl pour avoir le débit entre 2 pc
    Par Frich dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 22/05/2002, 17h22
  4. Réponses: 3
    Dernier message: 07/05/2002, 16h06
  5. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo