On suppose disponibles :
Pointeur allouer_chaine (char *s); Pointeur allouer_entier (int n); Pointeur allouer_reel (double x);
typedef Pointeur Enregistrement [CMAX];
int tableur (Enregistrement *t);Commenter les (quelques) points délicats de programmation lex.
%{ #define ENTIER 1 #define REEL 2 #define CHAINE 3 #define TAB 10 #define NL 11 /* et toutes les déclarations de l'énoncé */ %} signe [\+\-]? point [\.] chiffre [0-9] entier {signe}{chiffre}+ reel {entier}{point}{chiffre}+([eE]{entier})? %% {entier} return ENTIER; {reel} return REEL; [^\t\n]+ return CHAINE; \t return TAB; \n return NL; %% int tableur (Enregistrement *t) { int i, j, token; /* initialisation : toutes les cases sont vides */ for (i = 0; i < EMAX; i++) for (j = 0; j < CMAX; j++) t[i][j] = 0; i = j = 0; while (token = yylex ()) /* c'est bien '=' */ switch (token) { case ENTIER: t[i][j] = allouer_entier (atoi (yytext)); break; case REEL: t[i][j] = allouer_reel (atof (yytext)); break; case CHAINE: t[i][j] = allouer_chaine (yytext); break; case TAB: if (j < CMAX - 1) j++; break; case NL: if (i < EMAX - 1) {i++; j = 0;} break; } return i; }Commentaires :
%% {entier} t[i][j] = allouer_entier (atoi (yytext)); {reel} t[i][j] = allouer_reel (atof (yytext)); [^\t\n]+ t[i][j] = allouer_chaine (yytext); \t if (j < CMAX - 1) j++; \n if (i < EMAX - 1) {i++; j = 0;}outre qu'elle ne respecte pas l'énoncé, présente le défaut d'utiliser des variables globales ; mais dans le cadre de l'examen, elle est acceptable, et rapporte 4/5 des points.