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 :

Deux questions sur Flex & Bison


Sujet :

Générateurs de compilateur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Avatar de DjPoke
    Homme Profil pro
    schizophrène
    Inscrit en
    Août 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : schizophrène

    Informations forums :
    Inscription : Août 2005
    Messages : 95
    Billets dans le blog
    2
    Par défaut Deux questions sur Flex & Bison
    Bonjour,

    J'ai besoin de votre aide pour Flex & Bison, enfin essentiellement sur Bison.

    Voici la première question. J'ai le résultat de mes expressions mathématiques dans "exp" et mes chaines de caractères alpha numériques provenant de Flex dans "stringexp". Comment réunir les deux en une liste de paramètres auxquels je peux accéder ?

    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
     
     
    %type <float> function
     
     
    function: ABS "(" paramlist ")" { /* comment  accéder aux paramètres ? */ }
     ;
     
    paramlist: param
     | paramlist "," param
     ;
     
    param: exp { /*$$ = un double ou un integer */ }
     | stringexp { /*$$ = un chaine alphanumérique */ }
     ;

    Et la deuxième question, comment applique-t-on IF THEN ELSE dans une ligne de commandes où les instructions et les paramètres sont séparés par ':' ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    statements: statement
      | statements ":" statement 
     ;
     
    statement: INSTRUCTION paramlist { /* Appeler une fonction qui exécutera l'instruction et les paramètres */ }
      | IF exp THEN statement ELSE statement { /* Que faire ici ? */ }
      | IF exp THEN statement{ /* Que faire ici ? */ }
     ;
    Si je fais comme cela, j'obtiens un décalage/réduction, et en plus je ne sais pas comment exécuter ou non les fonctions.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 769
    Par défaut
    Et oui Flex/ Bison c'est un truc génial mais c'est chaotique, entre les différentes versions et la documentation qui semble merdik

    Sinon, si je comprends tes questions

    > /* comment accéder aux paramètres ? */

    Il faut passer par yytext


    > /* Que faire ici ? */
    Mettre du code C
    Dans un fichier flex .l, la majorité du temps, il faut retourner quelque chose.
    Dans un fichier bison .y, tu peux nettoyer la mémoire par exemple


    fichier flex .l:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <ELEMENT>{CharData}"]]>"{CharData} { return GARBAGE; }
    <ELEMENT>{S}         { return CharData; }
    <ELEMENT>{CharData}  { L32 copy_token(0, yyleng, TagContent); return CharData; }
    <ELEMENT>{Reference} { L33 copy_token(0, yyleng, TagContent); return Reference; }

    fichier bison .y:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    document: prolog element { clean_all(); }
              | prolog element MISC { clean_all(); }
              ;

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonjour,

    Citation Envoyé par DjPoke Voir le message
    J'ai besoin de votre aide pour Flex & Bison, enfin essentiellement sur Bison.

    Voici la première question. J'ai le résultat de mes expressions mathématiques dans "exp" et mes chaines de caractères alpha numériques provenant de Flex dans "stringexp". Comment réunir les deux en une liste de paramètres auxquels je peux accéder ?
    Avec « $0 », « $1 », « $2 », etc. Sauf que dans le cas présent, « paramlist » sera considéré comme un seul paramètre. Il faudra étudier le détail à la règle suivante.

    Et la deuxième question, comment applique-t-on IF THEN ELSE dans une ligne de commandes où les instructions et les paramètres sont séparés par ':' ?
    Si je fais comme cela, j'obtiens un décalage/réduction, et en plus je ne sais pas comment exécuter ou non les fonctions.
    Pour cela, on a besoin de voir le reste de tes définitions, et vérifier notamment qu'il n'y ait pas d'ambiguïté.
    Pour les fonctions, soit ça se passe au niveau sémantique (l'étape d'après), soit dans la définition de ABS, que tu pourras décomposer en sous-règles auxquelles tu pourras associer à chacune un morceau de code qui lui est propre.

  4. #4
    Membre confirmé
    Avatar de DjPoke
    Homme Profil pro
    schizophrène
    Inscrit en
    Août 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : schizophrène

    Informations forums :
    Inscription : Août 2005
    Messages : 95
    Billets dans le blog
    2
    Par défaut
    En fait, c'est vrai que je m'y prend mal pour la "paramlist".
    N'est-il pas préférable de traiter les paramètres un par un en vérifiant qu'ils sont bien séparés par une virgule ?
    Je vais tester, je vous tiens au courant.
    Merci pour votre aide.

    Si c'est bon, je mettrai ce sujet comme résolu.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par DjPoke Voir le message
    En fait, c'est vrai que je m'y prend mal pour la "paramlist".
    N'est-il pas préférable de traiter les paramètres un par un en vérifiant qu'ils sont bien séparés par une virgule ?
    Je vais tester, je vous tiens au courant.
    Merci pour votre aide.
    C'est déjà le cas, a priori, puisque que tu déclares que « paramlist := paramlist "," param | param ». Au passage, tu devrais essayer dans l'autre sens : « param "," paramlist ».

    Quoi qu'il en soit, ça veut dire que tu reconnais déjà tes « param » individuels et qu'ils sont réputés valides, au moins syntaxiquement. Il n'y a plus qu'à associer un morceau de code pour les traiter.

  6. #6
    Membre confirmé
    Avatar de DjPoke
    Homme Profil pro
    schizophrène
    Inscrit en
    Août 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : schizophrène

    Informations forums :
    Inscription : Août 2005
    Messages : 95
    Billets dans le blog
    2
    Par défaut
    Pour la gestion des "param" un par un, ça y est, c'est réglé, ça fonctionne, ce qui résout la première question.

    Par contre, quand je lance mon programme, il parse la premiere ligne de commande sans problèmes, mais me sort un "syntax error" si je tape une autre commande ensuite.
    J'ai déjà rencontré ce genre de problèmes mais je n'ai aucune idée d'où cela peut provenir.

    Auriez-vous une idée ?

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Là encore, il faudrait avoir le fichier entier pour trancher et savoir quel est l'axiome.

    Mais si le fichier est en l'état et que l'axiome est la première règle, donc « function », alors celle-ci n'est faite que pour traiter une seule expression. Il faudrait ajouter une règle supplémentaire en tête de fichier qui les englobe toutes du style « document: fonction | fonction document ».

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

Discussions similaires

  1. Deux questions sur un cours SGBD
    Par Francois_quad dans le forum Débuter
    Réponses: 3
    Dernier message: 17/01/2007, 17h40
  2. [Système] Deux questions sur PHP
    Par Oprichnik dans le forum Langage
    Réponses: 9
    Dernier message: 04/09/2006, 22h59
  3. [HTML] Deux questions sur l'insertion d'icônes (favoris)
    Par LE NEINDRE dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 22/02/2006, 14h47
  4. [Débutant] Deux questions sur la conversion (cast)
    Par kloss dans le forum Langage
    Réponses: 7
    Dernier message: 18/02/2006, 19h46
  5. [Together] Deux questions sur Borland Together UML
    Par srvremi dans le forum Autres
    Réponses: 4
    Dernier message: 02/11/2005, 09h32

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