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 :

Parser Lex & Yacc, parser un argument precis


Sujet :

Générateurs de compilateur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Par défaut Parser Lex & Yacc, parser un argument precis
    Bonjour,

    dans la creation d'un parser avec les outils Lex et Yacc, j'aimerais savoir si il est possible de parser un element en particulier plutot que d'obtenir une ligne d'entree.

    Je voudrais donc a la place de yyparse(); envoyer directement mon argument[1] a mon parser et obtenir mon resultat.

    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    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 487
    Par défaut
    Je pense que ton souci est plus précis que ça car le parsing, ça consiste justement à analyser un flux de texte et à s'assurer qu'il vérifie une grammaire donnée, justement pour pouvoir isoler les arguments recherchés.

    Si tu disposes déjà des données, et que ton but est de faire un traitement dessus, par exemple additionner deux nombres connus, alors tu n'as pas spécialement besoin de Lex & Yacc pour le faire.

    Développe ton problème un peu plus avant.

  3. #3
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Par défaut
    Pour continuer dans ton exemple d'expression mathematique.

    Si jamais j'ai cette expression:: ((5+5)*5)

    Quand je compile avec ma version actuel, avec Lex et Yacc, j'obtien un ligne d'entree pour y placer mon expression ((5+5)*5), il me donne mon resultat et me renvoi une ligne d'entree.

    Maintenant j'aimerais, toujours avec la meme expression, mettre mon expression en argument (./binaire "expression" , on est d'accord) et que mon parser utilise mon argument[1], le traite, me renvoi mon resultat et s'arrete.

    Donc sans passer pas yyparse(); qui ne prend pas d'argument specifique.

    En esperant etre un peu plus claire :s

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    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 487
    Par défaut
    Tu cherches donc à changer de source de données. Avant toute chose, il faut savoir qu'avant d'entrer dans le parser, tes données auront d'abord traversé le lexer, soit l'analyseur lexical (Lex). C'est donc de ce côté qu'il faut chercher l'extrémité de ton fichier. :-)

    Le « Lex & Yacc » de chez O'Reilly dit à ce sujet que :

    • AT&T Lex :
      AT&T Lex reads all of its input with the input() macro. To change the input source, redefine the input() and unput() macros. For example:
      Code C : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      %{
      extern char *mystring;
       
      #undef input
      #undef unput
      #define input() (*mystring++)
      #define unput(c) (*--mystring = c)
    • Flex
      Although flex provides an input() function, it gets characters using optimized in-line code. You can redefine YY_INPUT, the macro it uses to read blocks of data. It is called as:
      Code C : Sélectionner tout - Visualiser dans une fenêtre à part
      YY_INPUT(buffer,result,maxsize)
      ...


    Donc, si tu veux faire quelque chose de portable et que tu redistribues le code source de ton lexer, tu redéfinis au minimum les macros input() et unput() sachant qu'elles renvoient et attendent, respectivement, un caractère chacune, et que input() doit renvoyer zéro lorsque la fin est atteinte. On remarque alors que, comme c'est de cette manière qu'est construite une chaîne en C, il suffit de déréférencer et auto-incrémenter son pointeur. Si rien d'autre dans ton programme ne fait référence à ton argument, tu peux directement remplacer le mystring de l'exemple ci-dessus par ton argv[x] même si, en soi, ce n'est pas très propre.

    Sinon, si tu utilises GNU Flex, tu redéfinis YY_INPUT en suivant la même idée, mais avec des infos supplémentaires. Le livre donne l'exemple suivant :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %{
    #undef YY_INPUT
    #YY_INPUT(b, r, ms) (r = my_yyinput(b,ms))
    %}

  5. #5
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Par défaut
    Merci pour ces informations. Je vais essayer de me procurer le livre, en attendant je vais faire mes tests et je vous tiens au courant

  6. #6
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Par défaut
    Voila une solution correct, j'en dis pas beaucoup plus il suffit de lire la conversation au fur et a mesure.

    Ils partent donc du meme point que le notre et une solution "Ultime" est proposer

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

Discussions similaires

  1. Yacc Parser.mly : parse_error
    Par kheil dans le forum Caml
    Réponses: 1
    Dernier message: 03/01/2012, 16h13
  2. Installation de lex et yacc sur ubuntu
    Par maggie78 dans le forum Applications et environnements graphiques
    Réponses: 8
    Dernier message: 06/10/2011, 10h30
  3. Lex et yacc et la simuation sur linux
    Par rare1 dans le forum Linux
    Réponses: 7
    Dernier message: 21/07/2006, 09h05
  4. Commande pour analyser un fichier avec lex et yacc
    Par gRaNdLeMuRieN dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 13/09/2005, 19h12

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