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 :

construction d'arbre syntaxique abstrait des expressions arithmétique sur YACC/LEX


Sujet :

Autres éditeurs

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 3
    Points : 5
    Points
    5
    Par défaut construction d'arbre syntaxique abstrait des expressions arithmétique sur YACC/LEX
    Je souhaite une très bonne Année 2007 à tous les membres du groupe. Que le seigneur vous guide dans toutes vos entreprises et vous procure succès!

    Cher membre j’ai un peu de difficulté à construire un arbre syntaxique abstrait des expressions arithmétiques avec les outils YACC/LEX ou BISON/FLEX en précisant le type axiome et des différents tokens. Aidez un membre en détresse, merci d’avance.
    voici:
    ******************************************************
    le fichier yacc ou bison "arith.y"
    *******************************************************
    %{
    #include <stdio.h>
    #include <stdlib.h>
    #include "lex.yy.c"
    #include "arith.h" /* Contains definition of ‘symrec’. */
    void yyerror (char const *);
    %}
    %union
    {
    double val; /* For returning numbers. */
    symrec *tptr; /* For returning symbol-table pointers. */
    }
    /* Bison declarations. */
    %token <val> NUM
    %token <tptr> VARIABLE
    %token PLUS MOINS DIV MULT
    %token LPAR RPAR
    %start arith
    %% /* The grammar follows. */

    arith : exp PLUS exp
    | exp MOINS exp
    | exp MULT exp
    | exp DIV exp
    | LPAR exp RPAR
    ;

    exp : NUM { $$ = $1; }
    | VARIABLE { $$ = $1->value.var; }
    ;
    %%

    void yyerror (char const *s)
    {
    fprintf (stderr, "%s\n", s);
    }

    int main (int argc, char * argV[])
    {
    if(argc > 1)
    yyin = fopen(argV[1],"r");
    return yyparse ();
    }
    **********************************************************

    le fichier "arith.h"
    ********************************************************

    #include <stdio.h>

    struct symrec
    { char *name; /* name of symbol */
    union
    { double var; /* value of a VARIABLE */
    } value;
    struct symrec *next;
    };

    typedef struct symrec symrec;
    }

    *********************************************************
    Le fichier lex ou Flex arith.l
    *********************************************************
    %{
    #include <stdio.h>
    #include "arith.tab.h"
    %}

    %%
    "+" {return PLUS;}
    "-" {return MOINS;}
    "/" {return DIV;}
    "*" {return MULT;}
    \( {return LPAR;}
    \) {return RPAR;}
    [0-9]+ {return NUM;}
    [a-z][a-z0-9]* {return VARIABLE}
    %%

  2. #2
    Membre régulier Avatar de telliam
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 71
    Points
    71
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    arith : exp PLUS exp
    | exp MOINS exp
    | exp MULT exp
    | exp DIV exp
    | LPAR exp RPAR
    ;
     
    exp : NUM { $$ = $1; }
    | VARIABLE { $$ = $1->value.var; }
    ;
    il te manque le code dans cette partie,c'est ici que tu dois remplir ton arbre.
    tu devrais avoir un code du genre;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    arith : exp PLUS exp { $$ = operationNum(ADDITION,$1,$2); }
    | exp MOINS exp { $$ = operationNum(SOUSTRACTION,$1,$2); }
    | exp MULT exp { $$ = operationNum(MULTIPLICATION,$1,$2); }
    | exp DIV exp { $$ = operationNum(DIVISION,$1,$2); }
    | LPAR exp RPAR { $$ = $1; }
    ;
     
    exp : NUM { $$ = constantNum($1); }
    | VARIABLE { $$ = id($1); }
    ;
    chaque fonction id,constantNum,operationNum renvoyant un noeud de l'arbre

Discussions similaires

  1. Évaluation des expressions arithmétiques
    Par fifi40 dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 08/03/2015, 15h20
  2. Simplification des expressions arithmétiques
    Par Mazmouz125 dans le forum Prolog
    Réponses: 3
    Dernier message: 17/05/2011, 14h16
  3. Construction d'un arbre syntaxique abstrait
    Par Lithrein dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 14/09/2010, 23h18
  4. Réponses: 1
    Dernier message: 02/01/2007, 11h22
  5. Réponses: 1
    Dernier message: 09/12/2006, 10h13

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