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

Linux Discussion :

C++ && LEX && UNIX


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut C++ && LEX && UNIX
    Bonjour,

    J'ai un probleme d'execution d'un programme. Il est developpé en C++ avec l'appel a une fonction d'analyse lexical generer automaiquement sous flex. Son but: recuperer des information utile dans des fichiers .h et .c.

    Je l'ai tester sous windows et il fonctionne correctement. Mais au passage sous unix il fonctionne sauf la fonction d'analyse lexical ne marche pas.
    Precision: on passe bien dedans.
    voici le fichier .l

    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
    %{
    #include "PARSER.h"
    %}
    %option noyywrap
    %s macroVerHi macroVerLo macro256Proc macroProcessState macroVendor
    /****************************useful expressions********************************/
    versionHigh		"#define HIGH_SW_VERSION"[ \t]*
    versionLow		"#define LOW_SW_VERSION"[ \t]*"0x"
    more256Proc     "RTK_MORE_THAN_256_PROCESSES_FTR"
    processState    "TRA_PROCESS_STATE_DBG"
    vendorString    "USB_TRACE_VENDOR_STR_FTR"
    macro           .+
    retourchariot   \n
     
    %%
    {versionHigh}	{BEGIN(macroVerHi);}
    {versionLow}	{BEGIN(macroVerLo);}
    {more256Proc}	{BEGIN(macro256Proc);}
    {processState}	{BEGIN(macroProcessState);}
    {vendorString}	{BEGIN(macroVendor);}
     
    <macroVerHi>{macro}/\n   			{fprintf(yyout, "%s", yytext);BEGIN(INITIAL);}
    <macroVerLo>{macro}/\n   			{fprintf(yyout, "%s\n", yytext);BEGIN(INITIAL);}
    <macro256Proc>{macro}/\n			{fprintf(yyout, "More256Processes\n");BEGIN(INITIAL);}
    <macroProcessState>{macro}/\n		{fprintf(yyout, "ProcessState\n");BEGIN(INITIAL);}
    <macroVendor>{macro}/\n				{fprintf(yyout, "VendorString\n");BEGIN(INITIAL);}
     
    {retourchariot}       {/* on fait rien */}
    .                     {/* on fait rien */}
    %%
    void parsingMisc(void)
    {
        yylex();
    }
    voici le make file

    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
    parsingmisc.c: parsingmisc.l
    	flex -oparsingmisc.c -Pmiscfile parsingmisc.l
    	dos2unix lex.yy.c lex.yy.c
     
    main.exe: main.o MISC.o PARSER.o parsingmisc.o
    	g++ -Wall -o main.exe main.o MISC.o PARSER.o parsingmisc.o
     
    parsingmisc.o: parsingmisc.c parsingmisc.h
    	g++ -Wall -c parsingmisc.c -lfl
     
    PARSER.o: PARSER.cpp PARSER.h
    	g++ -Wall -c PARSER.cpp	
     
    MISC.o: MISC.cpp MISC.h PARSER.h
    	g++ -Wall -c MISC.cpp
     
    main.o: main.cpp MISC.h
    	g++ -Wall -c main.cpp
     
    clean:
    	rm -f main.o MISC.o PARSER.o parsingmisc.o
     
    cleanall: clean
    	rm -f main.exe
    	rm -f parsingmisc.c
     
    all: parsingmisc.c main.exe

  2. #2
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bon pour les purist et pour des complement d'info:

    le makefile sous UNIX
    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
    parsingmisc.c: parsingmisc.l
    	flex -l -oparsingmiscUNIX.c -Pmiscfile parsingmisc.l
    	dos2unix parsingmiscUNIX.c parsingmisc.c
     
    main.exe: main.o MISC.o PARSER.o parsingmisc.o
    	g++ -Wall -o main.exe main.o MISC.o PARSER.o parsingmisc.o
     
    parsingmisc.o: parsingmisc.c parsingmisc.h
    	g++ -Wall -c parsingmisc.c -lfl
     
    PARSER.o: PARSER.cpp PARSER.h
    	g++ -Wall -c PARSER.cpp	
     
    MISC.o: MISC.cpp MISC.h PARSER.h
    	g++ -Wall -c MISC.cpp
     
    main.o: main.cpp MISC.h
    	g++ -Wall -c main.cpp
     
    clean:
    	rm -f main.o MISC.o PARSER.o parsingmisc.o
     
    cleanall: clean
    	rm -f main.exe
    	rm -f parsingmisc.c
     
    all: parsingmisc.c main.exe
    le fichier .h de la classe appelante

    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
    #ifndef PARSEUR_H
    #define PARSEUR_H
    #include <string>
    #include <stdio.h>
     
    #ifndef EXTERNAL_VARIABLE
    #define EXTERNAL_VARIABLE
    extern FILE* miscfilein;
    extern FILE* miscfileout;
    #endif
     
    using namespace std;
     
    class Parser
    {
    public:
    	Parser();
    	~Parser();
    	void parsingMISCsection(const string fichierentree);
    };
    #endif
    le fichier Cpp de la classe

    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
    #include "PARSER.h"
    #include "parsingmisc.h"
     
    Parser::Parser()
    {
    	//none
    }
     
    Parser::~Parser()
    {
    	//none
    }
     
    void Parser::parsingMISCsection(const string fichierentree)
    {
    	miscfilein= fopen(fichierentree.c_str(), "r");
    	if (miscfilein==NULL)
    	{
    		cout<<"impossible d'ouvrir "<<fichierentree<<endl;
    		exit(-1);
    	}
    	miscfileout = fopen("resultat.txt","a");
    	if (miscfileout==NULL)
    	{
    		printf("impossible d'ouvrir resultat.txt");
    		exit(-1);
    	}
    	parsingMisc();
    	fclose(miscfileout);
    	fclose(miscfilein);
    }
    le fichier .h regoupant toutes mes analyse futures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifndef TOTO
    #define TOTO
     
    void parsingMisc(void);
    #endif
    le fichier l generant un fichier C pour faire l'analyse lexical

    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
    %{
    #include "PARSER.h"
    %}
    %option noyywrap
    %s macroVerHi macroVerLo macro256Proc macroProcessState macroVendor
    /****************************useful expressions********************************/
    versionHigh	"#define HIGH_SW_VERSION"[ \t]*
    versionLow	"#define LOW_SW_VERSION"[ \t]*"0x"
    more256Proc	"RTK_MORE_THAN_256_PROCESSES_FTR"
    processState	"TRA_PROCESS_STATE_DBG"
    vendorString	"USB_TRACE_VENDOR_STR_FTR"
    macro	.+
    retourchariot	\r\n
     
    %%
    {versionHigh}	{BEGIN(macroVerHi);}
    {versionLow}	{BEGIN(macroVerLo);}
    {more256Proc}	{BEGIN(macro256Proc);}
    {processState}	{BEGIN(macroProcessState);}
    {vendorString}	{BEGIN(macroVendor);}
     
    <macroVerHi>{macro}	{printf("versionHigh\n");fprintf(yyout, "%s", yytext);BEGIN(INITIAL);}
    <macroVerLo>{macro}	{printf("versionLow\n");fprintf(yyout, "%s\n", yytext);BEGIN(INITIAL);}
    <macro256Proc>{macro}	{printf("more256Proc\n");fprintf(yyout, "More256Processes\n");BEGIN(INITIAL);}
    <macroProcessState>{macro}	{printf("processState\n");fprintf(yyout, "ProcessState\n");BEGIN(INITIAL);}
    <macroVendor>{macro}	{printf("vendorString\n");fprintf(yyout,"VendorString\n");BEGIN(INITIAL);}
     
    {retourchariot}	{/* on fait rien */}
    {macro}	{/* on fait rien */}
    %%
    void parsingMisc(void)
    {
        printf("Start parsing\n");
        yylex();
        printf("Finish parsing\n");
    }

    Le changement des balise de retour chariot \n sous windows en \r\n sous unix ne change rien.
    en executant ce code on ne voit pas les sorties standards des printf des macros. en contre partie celles du void parsingMisc(void) sont bien visible

    au secour ca fait 1 semaine que je me bat!!!

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    personne ne sait ou a une idée pour me faire avencer?

  4. #4
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    C'est juste un problème de printf qui ne s'affiche pas ?

    ça me rapel des vieux problèmes que j'avais quand je programmais en C... Y'a pas une fonction à appeler du genre fflush pour vider les buffers et forcer l'affichage... ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Probleme resolu:

    L'importation de programme ecrite sous windows introduit des caractere de fin de ligne invisible sous nedit (LINUX et UNIX) seul Xemacs les affiche.
    Donc il vous faut ecrire le programme sous unix directement.

    1 semaine et demi pour ça ... BANG BANG

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