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++/CLI Discussion :

comment exécuter un script flex bison


Sujet :

C++/CLI

  1. #1
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut comment exécuter un script flex bison
    Bonjour

    J'ai trouvé 1 script flex bison que je cherche à comprendre et exécuter

    main.ccp
    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
    // section1: declaration, option parametres (settings)
    //----------------------------------------------------
    %{
    // declaraction de variables
    int chars = 0;
    int words = 0;
    int line = 0;
    %}
     
    %%
     
    // section 2: liste de motifs (pattern) et d'action
    //--------------------------------------------------
    // motif/pattern				action: c code to execute when the pattern mattches
    [a-zA-Z]+						{words++; chars += strlen(yytext);}								// strlen(): calculer la longueur de la chaîne de caractères
    //matches a word				updated nbr of words and characters seen
    //								yytext:	- variable
    //										- point to the input text that the pattern just matched
    \n								{chars++; lines++;}
    // matches a new line			updates the number of lines and characteres
    .								{chars++;}
    // regex dot <=> any character
     
    // each pattern at the beginning of a line
    // flex considers any line that starts with whitespace to be code to be copied into the generated c program
     
    %%	// separateur de section
     
    // section3: code c
    //-----------------
    int main( int argc, char* args[] )
    {
    	yylex();	// La compilation d'une source flex produit une fonction yylex(). Un appel de yylex() déclanche une analyse lexicale du flux yyin
    	printf("%8d%8d%8d\n", lines, words, chars);
    	return 0;
    }
    quand je le lance dans visual studio code le message d'erreur suivant apparaît:
    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
    main2.cpp:1:1: error: expected unqualified-id before '%' token
        1 | %{
          | ^
    main2.cpp:8:1: error: 'LETTRE' does not name a type
        8 | LETTRE   [a-zA-Z]
          | ^~~~~~
    main2.cpp:10:18: error: expected unqualified-id before '+' token
       10 | MOT      {LETTRE}+
          |                  ^
    main2.cpp:11:19: error: expected unqualified-id before '+' token
       11 | NOMBRE   {CHIFFRE}+
          |                   ^
    main2.cpp:16:15: error: 'total' does not name a type
       16 |     {NOMBRE}  total+= atoi( yytext );
          |               ^~~~~
    main2.cpp:17:5: error: expected unqualified-id before '{' token
       17 |     {MOT}     if (yyleng > score){
          |     ^
    main2.cpp:17:15: error: expected unqualified-id before 'if'
       17 |     {MOT}     if (yyleng > score){
          |               ^~
    main2.cpp:21:6: error: expected unqualified-id before '.' token
       21 |      .        printf("\nNi mot, ni nombre :%s", yytext);
          |      ^
    main2.cpp:22:5: error: expected unqualified-id before '%' token
       22 |     %%
          |     ^
    Pouvez vous m'aider?
    Cordialement

  2. #2
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 330
    Points : 4 151
    Points
    4 151
    Par défaut RTFM Flex Bison
    Bonjour,

    Il semble que vous essayez de compiler ce code comme si c'était du C++.

    Il faut d'abord le faire passer par flex, ce qui générera un code c. Ce code c comporte une fonction yylex() que vous pouvez utiliser pour faire l'analyse lexicale décrite (ici elle se contente de compter les mots, les lignes et les caractères du flux yin).

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  3. #3
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    J'ai pour fichiers d'origine
    Nom : Sans titre.png
Affichages : 495
Taille : 8,5 Ko

    Je compile en ligne de commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // cmd:
    // changer de repertoire courant: cd C:...\flex-and-bison-master\ch01-getting_started\calc
    // win_bison -d parser.y                                   => créer les fichiers parser.c et parser.h 
    // win_flex -o main.c scanner.l                            => créer les fichiers scanner.c et scanner.h à partir de scanner.l
    // gcc -o flex_bison_chap1.exe ??????.c                      => créer le fichier flex_bison_chap1.exe à partir de ??????.c
    A partir de quel fichier ??????.c créer flex_bison_chap1.exe?

  4. #4
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 330
    Points : 4 151
    Points
    4 151
    Par défaut
    Bonjour,

    Les commandes flex et bison produisent des fichiers c qui comportent des fonctions d'analyse lexicale et syntaxique. Pour les utiliser, il faut un corps de programme principal, ici a priori en c, qui, après les avoir déclarés (.h) les utilise.

    En résumé, flex et bison sont des outils qui génèrent d'autres outils en c. Le programme principal les utilisent. Dans l'exemple fourni yylex() compte les lignes, les mots et les caractères) mais il n'en fait rien. C'est au programme principal qu'il revient d'alimenter yylex(), de l'exécuter jusqu'à ce qu'il ne trouve plus de token (soit en fin de flux/fichier soit sur erreur) puis d'afficher les résultats stockés dans les variables compteur de yylex().

    Dans le cas de cet exemple pédagogique, il n'y a qu'un fichier .l qui génère un .c autonome (pas d'analyse syntaxique ni de programme utilisateur). Sauf erreur de ma part, il n'y a pas d'affectation de flux d'entrée à yyin. Je présume qu'il était prévu d'utiliser argv pour récupérer un nom de fichier à traiter en tant que yyin, mais je ne vois pas où. A défaut il n'a rien à traiter.

    Pour corriger cela on trouve sur le net des trucs comme ça à insérer juste avant le yylex (sans traitement d'erreur !) :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       if(argc > 1)
          yyin = fopen(argv[1], "r" );
       else
          yyin = stdin;   // entrée clavier par défaut
    En résumé : scanner.l -> flex -> scanner.c -> compilation c -> scanner.exe.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

Discussions similaires

  1. Comment exécuter un script SQL ?
    Par Mafate dans le forum Débuter
    Réponses: 2
    Dernier message: 11/03/2008, 10h52
  2. Comment exécuter un script avant la compilation ?
    Par jackfirst72 dans le forum Delphi
    Réponses: 1
    Dernier message: 05/04/2007, 10h14
  3. Réponses: 3
    Dernier message: 26/02/2007, 19h19
  4. Réponses: 5
    Dernier message: 16/03/2006, 00h37
  5. Réponses: 1
    Dernier message: 23/02/2005, 11h23

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