Bonjour, j ai fait l analyse lexical mais quand j ai compiler le fichier flex dans le cmd avec la commande flex fichier.l jai se probleme
et voila le fichier.l
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "d.tab.h"
extern YYSTYPE yylval;
extern int nb_ligne;
typedef struct
{
char NomEntite[20];
char CodeEntite[20];
char TypeEntite[20];
int ValEntite;
} TypeTS;
TypeTS ts[100];
int CpTabSym=0;
int recherche(char entite[])
{
int i=0;
while (i<CpTabSym)
{
if(strcmp(entite,ts[i].nomEntite)==0)return i;
i++;
}
return -1;
}
void inserer (char entite[],char code[])
{
if(recherche(entite)==-1)
{
strcpy(ts[CpTabSym].nomEntite,entite);
strcpy(ts[CpTabSym].codeEntite,code);
CpTabSym++;
}
}
void afficher ()
{
printf("\n/***************Table des symboles ******************/\n");
printf("________________________________________________________\n");
printf("\t| NomEntite | CodeEntite | TypeEntite | ValeurEntite |\n");
printf("________________________________________________________\n");
int i=0;
while(i<CpTabSym)
{
if ((strcmp(ts[i].TypeEntite,"")==0)&&(strcmp(ts[i].CodeEntite,"idf")!=0))
{
printf("\t|%10s |%12s |%12s | ----\t|\n",ts[i].NomEntite,ts[i].CodeEntite,ts[i].TypeEntite);
}
else
{
printf("\t|%10s |%12s |%12s | %5d\t|\n",ts[i].NomEntite,ts[i].CodeEntite,ts[i].TypeEntite,ts[i].ValEntite);
}
i++;
}
}
void insererType(char entite[], char type[])
{
int posEntite=recherche(entite);
if (posEntite!=-1)
{
strcpy(ts[posEntite].TypeEntite,type);
}
}
insérer la valeur d'une entité dans la table de symbole
void insereVal(char entite[], int val)
{
int posEntite=recherche(entite);
if (posEntite!=-1)
{
ts[posEntite].ValEntite=val;
}
}
int retournerVal(char entite[])
{
int posEntite=recherche(entite);
return ts[posEntite].ValEntite;
}
int doubleDeclaration (char entite[])
{
int posEntite=recherche(entite);
if (strcmp(ts[posEntite].TypeEntite,"")==0) return 1;
else return 0; // le type de l'entité existe dejà dans la TS et donc c'est une double déclaration
}
%}
chiffre[0-9]
maj[A-Z]+
minis[a-z]+
idf {maj}+({minis}|{chiffre})
INTEGER {chiffre}+
IntegerSign "(-"{chiffre}+")"
FLOAT {chiffre}+"."{chiffre}+
floatSigne "(-"{float}+")"
car ("'".*"'")
str (\".*\")
oprC G|L|GE|LE|EQ|DI
comment ("//".*)
nomprg {idf}
%%
const {inserer(yytext,"mc-const");return mc-const;}
Desplay {inserer(yytext,"mc desplay");return mc_desplay;}
Vecteur {inserer(yytext,"mc_vecteur"); return mc_vecteur;}
Read {insert(yytext,"mc_read");return mc_read;}
for {inserer(yytext,"mc_for");return mc_for;}
end {inserer (yytext,"mc_end");return mc_end;}
If {inserer(yytext,"mc_if");return mc_if;}
Else {inserer(yytext,"mc_else");return mc else;}
& {inserer(yytext,"sgn_format_char");return sgn_format_char;}
@ {inserer(yytext,"sgn_lec");return sgn_lec;}
# {inserer(yytext,"sgn_format_str");return sgn_format_str;}
% {inserer(yytext,"sgn_format_fl");return sgn_format_fl;}
$ {inserer(yytext,"sgn_format_int");return sgn_format_int;}
INTEGER {inserer(yytext,"mc_int");return mc_int}
FLOAT {inserer(yytext,"mc_fl");return mc_fl;}
CHAR {inserer(yytext,"mc_char");return mc_char;}
STRING {inserer(yytext,"mc_str");return mc_str}
NOT {inserer(yytext,"op_log_not");return op_log_not;}
AND {inserer(yytext,"op_log_and");return op_log_and;}
OR {inserer(yytext,"op_log_or");return op_log_or;}
= {inserer(yytext,"affec");return affec;}
[+-/*] {inserer(yytext,strdup(yytext));return yytext[0]);}
[{}()"":;|] {inserer(yytext,strdup(yytext));return yytext[0]);}
{comment} {inserer(yytext,"comment");return}
{idf} {if(yyleng<=8){yylval.str=strdup(yytext);inserer(yytext,"idf");return idf;}
{oprC}{inserer(yytext,strdup(yytext));return yytext[0];}
\n nb_ligne++;
{str} {inserer(yytext,"chaine_car");return chaine_car;}
{car} {if(yyleng<4){inserer(yytext,"char");return char;}
{floatSigne} {inserter(yytext,"fl_sgn");return fl_sgn}
{IntegerSign} {if((yyleng<=5)&& atoi(yytext)<=(32767)&& atoi(yytext)>=(-32768))inserer(yytext,"int_sign");return}
{Integer} {if((yyleng<=5)&& atoi(yytext)<=(32767)&& atoi(yytext)>=(-32768)){inserer(yytext,"intval");return intval;}
else printf("erreur lexical:idf trop long";}
. printf("erreurlexicale:entite non reconnu des le debut ligne ,%d \n",nb_ligne);
aide moi c urgent