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.