• [^] # Re: Élémetns de réponse ;

    Posté par (site web personnel) . En réponse au message La grammaire et Bison. Évalué à 1.

    Bien, tout d'abiord merci pour ta réponse. Suite a ta demande, voici l'intégralité de mon fichier .l et .y, afin de t'eclairer un peu plus :)

    Je tiens à préciser que c'est pour moi un exercice pédagogique, donc ce n'est certainement pas optimisé, ni très logique, c'est juste une tentative de "mon 1er langage" :)


    lex.l :

    %{
    #include <stdio.h>
    #include "gram.tab.h"
    %}

    %%



    afficher return FUNC_AFFICHER;
    saisir return FUNC_SAISIR;
    chaine return VAR_CHAINE;
    entier return VAR_ENTIER;
    reel return VAR_REEL;
    [0-9]+ yylval.entier = atoi(yytext); return ENTIER;
    [0-9]*\.[0-9] yylval.reel = atof(yytext); return REEL;
    \".*\" yylval.chaine = strdup(yytext+1); yylval.chaine[strlen(yylval.chaine)-1] = '0円'; return CHAINE;
    ^#.*$ return COMMENTAIRE;
    [a-zA-Z_][a-zA-Z_0-9] yylval.chaine = strdup(yytext); return VARIABLE;
    ; return FIN;
    \( return PAR1;
    \) return PAR2;
    \n
    \t
    \
    .


    gram.y :

    %{
    #include <stdio.h>
    #include <string.h>

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

    int yywrap()
    {
    return 1;
    }

    main()
    {
    yyparse();
    }

    %}

    %token FIN PAR1 PAR2 COMMENTAIRE FUNC_AFFICHER FUNC_SAISIR VAR_CHAINE VAR_ENTIER VAR_REEL EGAL

    %union
    {
    long entier;
    char *chaine;
    double reel;
    }

    %token ENTIER
    %token REEL
    %token CHAINE
    %token VARIABLE


    %%

    ligne:
    |
    ligne fonction FIN
    |
    ligne creation FIN

    fonction:
    |
    FUNC_AFFICHER PAR1 CHAINE PAR2 FIN
    {
    printf("%s\n",3ドル);
    }
    ;
    |
    FUNC_SAISIR PAR1 VARIABLE PAR2 FIN
    {
    char tab[255];
    fgets(variable,255,stdin);
    }
    ;

    creation:
    |
    VAR_CHAINE VARIABLE '=' CHAINE FIN
    |
    VAR_ENTIER VARIABLE '=' ENTIER FIN
    |
    VAR_REEL VARIABLE '=' REEL FIN


    Voilà. Je ne vois pas trop comment m'en dépatouiller désormais...

    En fait mon "langage" doit savoir faire 3 trucs :

    1/ Avoir une fonction afficher("chaine"); qui affiche une chaine (ca marche à l'heure actuelle)
    2/ Avoir une fonction saisie(variable); qui affiche un prompt puis stock la réponse dans variable
    3/ Peut creer 3 types de variables, chaine, entier, reel, via a déclaration suivante : chaine ma_chaine = ""; (l'initialisation est obligatoire pour l'instant)

    Le reste viendra plus tard..

    Bref, à mon avis, j'ai mal découpé mon problème initial, donc les fondations etant mauvaises....