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

Autres éditeurs Discussion :

[Flex & Bison] Problème avec yyFlexLexer


Sujet :

Autres éditeurs

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut [Flex & Bison] Problème avec yyFlexLexer
    Bonjour à tous,
    Bah voila, peut etre avez vous vu mes anciens sujets sur des problemes avec lex et yacc, et bien en voila un autre

    Mon projet marche bien avec les entrées par defaut de yyFlexLexer, a savoir les entrees sorties sur l'ecran.
    Maintenant si j'essaie de lui dire, prend comme entrée le fichier suivant (ce qui est le but final), là ca plante ... Error memory (acces violation je crois ) etc..

    Voila en gros mon fichier yacc :
    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
     
    %{       
                //Pour enlever les warnings  du compilateur de visual C++ 6.0
                #pragma warning(disable:4786)
                #include <iostream>
                #include <vector>
                #include <fstream>
                #include <string>         
                #include <FlexLexer.h>
                // -- prototypes des fonctions obligatoires
                void yyerror(char *);
                int yylex();
                // -- variable globale qui est mon scanner
                yyFlexLexer* lexer;
    %}
     
    //La grammaire non montree ici
     
    void yyerror(char *s)
    {
        fprintf(stderr, "%s\n", s);
    }
     
    int yylex(void)
    {
                return lexer->yylex() ;
    }
     
    int main(int argc, char** argv)
    {
                std::ifstream yyin("in.txt");
                if(!yyin)
                {
                            std::cerr << "Impossible de lire le fichier source" << std::endl;
                            exit(1);
                }
                //Des cast qui sont normalement corrects
                lexer = new yyFlexLexer(reinterpret_cast<class istream *>(&std::cin), reinterpret_cast<class ostream *>(&std::cout));
     
                try
                {
                            yyparse();
                }
                catch ( ... ) // traite toutes les exceptions
                {
                            std::cerr << "Erreur inconnue. Ligne : " << lexer->lineno() << std::endl;
                }
                return 0;
    }
    J'utilise donc flex et bison sous windows et je travaille avec Visual C++ 6.0

    Je ne comprend pas trop pourquoi cela ne marche pas. Et si l'erreur vient d'ailleurs , comment la voir ?

    Merci d'avance
    ++

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    arf voila un bel exemple de mauvais copié/collé
    En fait il je veux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lexer = new yyFlexLexer(reinterpret_cast<class istream *>(yyin), reinterpret_cast<class ostream *>(&std::cout));
    Car je veux lire dans le fichier ...

    Mais ce qui m'a induit en erreur lors de mn copié/collé c'est que l'exemple dans le message au dessus ne marche pas non plus !! Alors qu'il devrai puisque si je ne met rien , cela est censé revenir au meme (et quand je met rien , ca marche)

    Du coup je pense à un probleme de cast...
    Vous en pensez quoi ?
    Merci

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    reinterpret_cast c'est du cast bourrin, alors que pour l'upcasting il y a un décalage de pointeur à effectuer. Essaye static_cast, ou simplement rien du tout : le cast vers une classe de base est automatique en C++.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    salut loulou
    Je vais essayer avec static_cast
    reinterpret_cast etait suggéré par le compilateur d'où sa prescence
    En tout cas si je ne met rien , ça ne veut passer
    Je reviens de suite

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    humm non toujours pas ...
    Ce coup ci je ramène avec moi les erreurs afin que cela soit plus clair
    Avec static_cast :
    Compiling...
    calc2.y.cpp
    .\calc2.y(628) : error C2440: 'static_cast' : cannot convert from 'class std::basic_istream<char,struct std::char_traits<char> > *' to 'class istream *'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    .\calc2.y(628) : error C2440: 'static_cast' : cannot convert from 'class std::basic_ostream<char,struct std::char_traits<char> > *' to 'class ostream *'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    calc2.lex.cpp
    Error executing cl.exe.
    Sans cast :
    Compiling...
    calc2.y.cpp
    .\calc2.y(628) : error C2664: '__thiscall yyFlexLexer::yyFlexLexer(class istream *,class ostream *)' : cannot convert parameter 1 from 'class std::basic_istream<char,struct std::char_traits<char> > *' to 'class istream *'
    Là je pige pas trop...

    Je precise (meme si c pas important), que mon appli ne plante pas avec le try..catch comme ci dessus. Sans cela elle plante avec le type d'erreur expliqué au debut.

    Voila,

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    As-tu bien inclu <iostream> avant tout ça ? Le "class istream" du message d'erreur me paraît bizarre, on dirait qu'il y a une déclaration anticipée sans l'inclusion qui doit suivre.

    Personnellement je n'ai aucun problème avec ce code :

    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
    #include <iostream>
    #include <fstream>
     
    void yyLexer(std::istream* is, std::ostream* os) {}
     
    int main()
    {
        std::ifstream fin;
        std::ofstream fout;
     
        yyLexer(&fin, &fout);
        yyLexer(&std::cin, &std::cout);
     
        return 0;
    }

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    Merci bcp loulou de te pencher sur mon pb 8)
    EDIT // Je rajoute des trucs

    Voila l'entete de la classe yyFlexLexer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class yyFlexLexer : public FlexLexer {
    public:
                // arg_yyin and arg_yyout default to the cin and cout, but we
                // only make that assignment when initializing in yylex().
                yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 ); 
                virtual ~yyFlexLexer();
    Revoila l'entete de mon fichier yacc avec ces includes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                #pragma warning(disable:4786)
                #include <iostream>
                #include <vector>
                #include <fstream>
                #include <string>         
                #include <FlexLexer.h>
    Un peu plus bas dans mon fichier yacc, mon main assez simple
    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
     
    int main(int argc, char** argv)
    {
                using namespace std;
                ifstream yyin("in.txt");
                if(!yyin)
                {
                            cerr << "Impossible de lire le fichier source" << endl;
                            exit(1);
                }
                lexer = new yyFlexLexer(&cin, &cout);
                try
                {
                            yyparse();
                }
                catch ( ... ) // traite toutes les autres exceptions
                {
                            cerr << "Erreur inconnue. Ligne : " << lexer->lineno() << endl;
                }
                return 0;
    }
    Seulement maintenant que j'ai fais le using namespace std j'obtiens ces erreurs :
    Compiling...
    calc2.y.cpp
    .\calc2.y(620) : error C2872: 'cerr' : ambiguous symbol
    .\calc2.y(626) : error C2872: 'cin' : ambiguous symbol
    .\calc2.y(626) : error C2872: 'cout' : ambiguous symbol
    .\calc2.y(635) : error C2872: 'cerr' : ambiguous symbol
    Error executing cl.exe.
    Là je ne comprend plus du tout. Il doit y avoir un probleme avec mes cin et cout non? car ces erreurs ne sont pas logiques dans mon cas n'est-ce pas ?

    ++ et merci bcp de m'aider

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je pense qu'il y a une mauvaise manip avec les inclusions d'en-têtes. Mais difficile d'en dire plus, est-ce que tu peux uploader quelque part la totalité de tes sources ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    yop,
    en fait le projet lui meme je ne peux pas en donner les sources ( c'est pas que j'en ai pas envie hein ). Je vais preparer un petit exemple simplifié, en espérant (sic) que le problème s'y retrouve afin de bien comprendre d'ou il vient.
    Je te prepare ça

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    pfiou quelle galère pour uploader ça. J'avais oublié que ce forum ne propose pas l'option d'upload de fichiers.
    Enfin bon, voila c'est ici normallement : http://kiroukou.superihost.com/sources/projet_lex_yacc.zip

    C'est sous forme de projet VC++ 6.0 . Un fichier "A LIRE.txt" contient qq details pour faire marcher le tout normallement

    ++

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Merci, je vais regarder ça !

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ok, c'est bien ce que je soupçonnais.

    En gros, ce qui se passe dans les fichiers sources c'est ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class istream;
     
    istream* is;
     
    #include <iostream>
    using namespace std;
     
    istream* is2; // -> ambigü : est-ce celui qu'on vient de déclarer ou celui venant d'iostream ?
    Le problème est que tout est généré par Flex / Bison, donc difficile d'intervenir dessus (à moins de le faire après chaque précompilation).

    La seule solution que je verrais est une grosse bidouille : remplacer "class istream;" par une inclusion de <istream> et un using namespace std;

    Pas très très joli...

    Comme quoi, même avec la version C++ on voit bien que ce ne sont pas des outils superbement adaptés à ce langage. Personnellement j'ai dû remplacer tous les <iostream.h> par des <iostream> + using namespace std;

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    d'accord.... Je vois le truc.
    Ouais en effet il aurait surement été mieux d'utiliser d'autres logiciels comme tu me l'avais suggéré dans un autre topic Le problème est que le developpement est bien avancé maintenant...

    Ce que je vais faire c'est m'arranger pour ne compiler le lex qu'en cas de besoin au début. Je vais quand même réfléchir à une possibilité plus propre car en effet c'est contraignant tout de même.

    Je vais aussi aller voir les dernieres version de flex et bison, peut etre ce problème à été corrigé


  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    Tiens je viens d'avoir une idée.
    Il me semble qu'il est possible d'écrire soit meme quelque chose sur la sortie standart cout. Du coup si je fais renvoyer le contenu de mes fichiers sur cette sortie standard, flex ne devrai y voir que du feux non ?
    Par contre est ce que cela va etre esthétique, lol j'en sais rien. Juste l'idée que je trouve intéréssante, tu en penses quoi ?

    ++

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Oui, tu peux très bien faire une redirection de l'entrée standard pour l'alimenter avec ton fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // A la ligne de commande
    TonParser.exe < in.txt

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    Hop , je profite que ce message ne soit pas trop loin dans la liste pour le faire remonter
    Je souhaites juste dire que j'ai trouvé une solution, un peu bourrine certes, qui consiste à parser le fichier généré par flex et le modifier pour le rendre compatible avec le C++ "standard"

    J'ai intégré ceci avec VisualC++ dans le custom build de mon fichier lex, juste apres l'appel a flex.
    Cela semble bien marcher
    Cette petite application est tres simple, mais si quelqu'un rencontre un jour le même problème et qu'il souhaite ce petit executable, qu'il n'hésite pas à me contacter

    ++ et merci encore loulou pour ton aide

Discussions similaires

  1. [Flex3] pseudo Push flex/php et problème avec URLloader
    Par ouaqa dans le forum Flex
    Réponses: 4
    Dernier message: 17/09/2010, 13h19
  2. [Flex/Bison] problème avec la récursivité
    Par la_praline dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 09/09/2008, 13h41
  3. Problème avec le bison
    Par yous18 dans le forum C
    Réponses: 1
    Dernier message: 02/06/2008, 11h10
  4. [Flex / Bison] Problème de compilation sous Visual C++
    Par levalp dans le forum Générateurs de compilateur
    Réponses: 1
    Dernier message: 25/07/2006, 15h26
  5. Flex et Bison avec Visual
    Par kiroukou dans le forum MFC
    Réponses: 16
    Dernier message: 16/05/2006, 14h47

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