Précédent   Forum des professionnels en informatique > Autres langages > Autres langages
Autres langages Clipper, D, Eiffel, Forth, FoxPro, Kpl, NSDK, R, Rebol, Smalltalk, ... Tutoriels
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/03/2011, 08h24   #1
Invité de passage
 
Inscription : août 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 9
Points : 4
Points : 4
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 :
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 :
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 :
Citation:
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 ?
krisss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 17h36   #2
Invité de passage
 
Inscription : août 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 9
Points : 4
Points : 4
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 ?
krisss est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h20.


 
 
 
 
Partenaires

Hébergement Web