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 :

[Lex/Yacc] Le parseur ne reconnaît pas les tokens de type NUM


Sujet :

Générateurs de compilateur

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 9
    Points
    9
    Par défaut [Lex/Yacc] Le parseur ne reconnaît pas les tokens de type NUM
    Bonjour à tous ,

    J'ai écrit deux fichiers lex et yacc dans le but d'avoir un parseur d'un langage de l'IEEE ( STIL ). J'ai l'ER suivante :
    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
    /* Inclusion C et autres VG */
    %%
    /*
    Autres ER
    */
    dig     [0-9]
    num1         {dig}+\.?([eE][-+]?{dig}+)?
    num2         {dig}*\.{dig}+([eE][-+]?{dig}+)?
    number       {num1}|{num2}
    /*
    Autres ER
    */
    %%
    /*
    Autres règles
    */
    {number}        {if(!bus) {return(NUM);} if (bus) REJECT;}
    /*
    Autres règles
    */
    Dans le fichier yacc il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    stil_language :
    	STIL_statement top_level_statements
    	{
    		bus = 0;
    	}
    	;
     
    STIL_statement :
    	STIL NUM ';'
    	| STIL NUM {any=1;} '{' anything_statements_plus '}' {any=0;}
    	;
    stil_language est le symbole de départ.

    La variable bus est initialisée à 0 ( Dans le main , il fait une vérif et elle est bien initialisée à 0).

    Le problème c'est que le parseur ne reconnait pas les token de type NUM !
    Il les réécrit sur la sortie standard et invoque yyerror quand j'entre un symbole qui ne correspond pas à NUM ;

    Voici le prompt en exemple :
    user@pc_of_user{stil_directory} : parser
    bus =0 , any = 0
    STIL 1.0 ;
    1.0 bus =0 , any = 0 ; Syntax error : --> unexpected ';'
    Ce qui est souligné , c'est yyerror. Ce qui est italique , c'est moi qui l'ai écrit.

    Quelqu'un aurait-il une idée sur l'erreur s'il vous plait ?

  2. #2
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Apparemment le problème se situe au niveau du caractère . , il n'est pas reconnu , regardez ce mini-travail :

    fichier lex :

    %option noyywrap

    ws [ \t]+
    dig [0-9]
    simple_float {dig}+.{dig}+
    num1 {dig}+\.?([eE][-+]?{dig}+)?
    num2 {dig}*\.{dig}+([eE][-+]?{dig}+)?
    number {num1}|{num2}

    %%

    \n {mylineno++; if( any && g_flagKeyWord ) fprintf(g_fUserKFile,"%s",yytext);}
    {number} {printf("OK5\n"); if(!bus) {return(NUM);} if (bus) REJECT;}
    STIL {return(STIL);}
    "//".* {if(g_flagKeyWord) REJECT; while(input()!='\n') ; mylineno++;}
    "/*" {
    register int c;
    for ( ; ; )
    {
    while ( (c = input()) != '*' &&
    c != EOF && c != '\n')
    ; // eat up text of comment

    if ( c == '*' )
    {
    while ( (c = input()) == '*' )
    ;
    if ( c == '/' )
    break; /* found the end */
    }

    if ( c == EOF )
    {
    printf( "EOF in comment ERROR" );
    break;
    }

    if (c == '\n')
    {
    mylineno++;
    /* break; */
    }
    }
    }
    Ann[ \t]*"{*" {
    loop2:

    while(input()!='*');
    switch(input()){
    case '\n' :
    mylineno++;
    goto loop2;
    case '}':
    /* return(ANNCOMMENT); */
    break;
    case '*':
    unput('*');
    default:
    goto loop2;
    }
    }
    "\\" {printf("syntax error !");}
    %%

    fichier yac

    %start stil_language
    %token NUM STIL
    %left '+' '-'
    %left '*' '/' /* left associative, higher precedence */
    %left UNARYMINUS

    %%

    stil_language :
    STIL_statement
    {
    printf("OK1\n");
    bus = 0;
    }
    ;

    STIL_statement :
    STIL {printf("OK2\n");} NUM {printf("OK3\n");} ';' {printf("OK4\n");}
    ;


    %%

    extern char *yytext;
    extern char * yytname;

    int yyerror(char *s)
    {
    //char* msg;
    //if (!StilNotSupportFeature) {
    //msg = (char *) malloc(strlen(s)+strlen(yytext)+200);
    printf ("bus = %d , any = %d\n" , bus , any );
    printf("Syntax error : --> unexpected '%s'\n" ,yytext);

    #ifdef DEBUG
    if (yychar!=YYEMPTY) {
    printf("\n** line %d ** : %s --> %s (%s)\n", mylineno, s, yytext, yytname[YYTRANSLATE(yychar)]);
    }
    #endif
    }
    int main (int argc , char * argv[])
    {
    printf ("bus = %d , any = %d " , bus , any );
    if ( argc == 2 )
    yyin = fopen ( argv[1] , "r" );
    else if ( argc >= 3 )
    {
    yyout = fopen ( argv[2] , "w" );
    yyin = fopen ( argv[1] , "r" );
    }
    yyparse();
    if ( argc == 2 )
    fclose ( yyin ) ;
    if ( argc >= 3)
    fclose ( yyout ) ;
    return 1 ;
    }

    L'execution de ce parseur donne :

    user@user_s_place{user_dir} : ./exec stil_6.yac stil_6.lex
    bus = 0 , any = 0 STIL 1.0 ;
    OK2
    1.0 ;

    J'ai écrit ce qui est en italique... Quelqu'un a une idée du problème ?

Discussions similaires

  1. Eclipse ne reconnaît pas les classes importées
    Par daydream123 dans le forum Eclipse
    Réponses: 2
    Dernier message: 24/06/2011, 09h19
  2. [MySQL] Ne reconnaît pas les commandes mysql
    Par Lyna31 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 26/04/2010, 14h39
  3. [SP-2007] mon workflow ne reconnaît pas les utilisateurs
    Par Mihinot dans le forum SharePoint
    Réponses: 2
    Dernier message: 21/12/2009, 17h08
  4. Réponses: 1
    Dernier message: 10/07/2009, 12h44
  5. Réponses: 0
    Dernier message: 14/12/2008, 08h48

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