|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||||
|
Invité de passage
![]() Inscription : août 2009 Messages : 9 ![]() |
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 :
Code :
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 : Citation:
Quelqu'un aurait-il une idée sur l'erreur s'il vous plait ? |
|||||
|
|
00
|
|
|
#2 |
|
Invité de passage
![]() Inscription : août 2009 Messages : 9 ![]() |
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 ? |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com