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

Générateurs de compilateur Discussion :

analyse lexical en c++


Sujet :

Générateurs de compilateur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Par défaut analyse lexical en c++
    slt tous le monde j'ai un programme prolog et je veux écrir un programme en c++ pour l'analyse lexical de se programme (prolog);
    et je c'est pas comment faire
    merci d'avance

    voila le programme en prolog

    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
    pere(farid,yacine).
     
    pere(yacine,djamel).
     
    pere(zaki,lotfi).
     
    pere(lotfi,halim).
     
    mere(imene,fatiha).
     
    mere(fatiha,nadjet).
     
    gpere(X,Z):-pere(X,Y),pere(Y,Z).
     
    gmere(X,Z):-mere(X,Y),mere(Y,Z).

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    boost::spirit doit pouvoir répondre à la question, un tutorial est disponible...

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Tiens, j'ai voulu tester boost.spirit (que je ne connaissais pas), et cela donne ça :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #include <boost/config/warning_disable.hpp>
    #include <boost/spirit/include/qi.hpp>
    #include <boost/spirit/include/phoenix_core.hpp>
    #include <boost/spirit/include/phoenix_operator.hpp>
    #include <boost/spirit/include/phoenix_stl.hpp>
    #include <boost/algorithm/string/trim.hpp>
     
    #include <iostream>
    #include <fstream>
    #include <string>
     
    struct Result
    {
    	enum Type { PERE, MERE };
     
    	Type        type;
    	std::string nom1;
    	std::string nom2;
    };
     
    template <typename Iterator>
    bool do_parse(Iterator first, Iterator last, Result& res)
    {
    	using boost::spirit::qi::eps;
    	using boost::spirit::qi::char_;
    	using boost::spirit::qi::_1;
    	using boost::spirit::qi::phrase_parse;
    	using boost::spirit::ascii::space;
    	using boost::phoenix::ref;
    	using boost::phoenix::push_back;
     
    	Result::Type type;
    	std::string  nom1;
    	std::string  nom2;
     
    	bool parsed = phrase_parse(first, last,
     
    		//  Begin grammar
    		(
    			"pere(" >> +(char_ - ',')[push_back(ref(nom1), _1)] >> ',' 
    			        >> +(char_ - ')')[push_back(ref(nom2), _1)] >> ")."
    					>> eps[ref(type) = Result::PERE]
    		|
    			"mere(" >> +(char_ - ',')[push_back(ref(nom1), _1)] >> ',' 
    			        >> +(char_ - ')')[push_back(ref(nom2), _1)] >> ")."
    					>> eps[ref(type) = Result::MERE]
    		),
    		//  End grammar
     
    		space);
     
    	if (!parsed || first != last) // fail if we did not get a full match
    		return false;
    	res.type = type;
    	res.nom1 = nom1;
    	res.nom2 = nom2;
    	return parsed;
    }
     
    /**
     *  Main program
     */
    int main()
    {
    	std::ifstream ifile("test.txt");
    	if (!ifile) {
    		return EXIT_FAILURE;
    	}
     
    	bool ok = true;
    	std::string line;
    	while (ok && std::getline(ifile, line)) {
    		boost::trim(line);
    		if (line.empty()) {
    			continue;
    		}
    		std::cout << "Parsing '" << line << "' : ";
            Result res;
            if (do_parse(line.begin(), line.end(), res)) {
                std::cout << "Succeeded" << std::endl;
                std::cout << " -> " << res.type << " : " << res.nom1 << ", " << res.nom2 << std::endl;
                std::cout << std::endl;
            }
            else {
                std::cout << "Failed !" << std::endl;
            }
    	}
        return 0;
    }
    C'est probablement pas la meilleur solution, mais ça marche (pour pere et mere ). Je te laisse poursuivre.

    PS : Des essais effectués par Eran Ifrah (l'auteur de l'IDE CodeLite) a montré que ce parseur est très lent par rapport à yacc/flex.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    ça marche sauf si c'est un cours et que l'exercise est d'écrire soit-même le parseur de zéro.

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    PS : Des essais effectués par Eran Ifrah (l'auteur de l'IDE CodeLite) a montré que ce parseur est très lent par rapport à yacc/flex.
    Ca dépend quelle version de spirit il a testé... si il est resté sur spirit.classic alors oui c'est un problème connu le parsage est lent sur certains compilos / machines.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Citation Envoyé par Goten Voir le message
    Ca dépend quelle version de spirit il a testé... si il est resté sur spirit.classic alors oui c'est un problème connu le parsage est lent sur certains compilos / machines.
    Il avait fait ces essais il y plus de 2 ans, donc sur une version 1.x. L'autre argument qu'il soumettait était la maintenance de parseur, plus simple (selon lui) avec yacc/flex. Vu que je n'ai pas le courage d'implementer un parseur c++ complet, je ne saurai dire si la version 2.1 de spirit à rattrapé suffisament sont retard pour pouvoir être intégrer dans le dev d'un IDE pour c++.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    ça marche sauf si c'est un cours et que l'exercise est d'écrire soit-même le parseur de zéro.
    Oui, mais bon, si est un exo, je ne suis pas sûr que c'est la réponse attendu par le prof. En plus, c'était plus pour tester, ce n'est pas fini, et je ne fais rien des résultats. Bref, si c'est un étudiant devant répondre à un exercice, il lui reste un gros travail d'apprentissage de cette bibliotheque si il veut arriver à ces fins...

Discussions similaires

  1. Qu'est ce qu'une analyse fonctionelle
    Par sandrine dans le forum Débats sur le développement - Le Best Of
    Réponses: 22
    Dernier message: 28/02/2015, 19h03
  2. Réponses: 0
    Dernier message: 22/12/2014, 13h28
  3. générateur d'analyse lexical avec FLEX
    Par capoBN dans le forum Générateurs de compilateur
    Réponses: 1
    Dernier message: 04/04/2011, 19h14
  4. Outil d'analyse de code
    Par Bloon dans le forum Outils
    Réponses: 8
    Dernier message: 07/08/2007, 09h04
  5. Analyser la ligne de commande
    Par benj29 dans le forum C
    Réponses: 14
    Dernier message: 19/11/2002, 04h13

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