
\input mias
\hsize=13cm 
\hoffset -2mm
\TP 3

N'oubliez pas de garder une trace de votre travail ...
\par\vskip 2cm
Dans le TP pr\'ec\'edent, on introduisait, dans le programme LEX lui--m\^eme des listes de mots
\`a chacune desquelles \'etait associ\'ee une classe grammaticale. Le pr\'esent sujet
remplace la donn\'ee {\sl a priori} de telles listes par celle d'une {\sl table de symboles} :
une partie du programme permet de ranger des mots dans cette table, 
ainsi que leur classe grammaticale, l'autre de retrouver la classe grammaticale
des mots d'une phrase. Voici un exemple d'ex\'ecution
du programme que l'on se propose d'obtenir (Les lignes commen\c cant 
par {\tt >}  sont le r\'esultat de l'ex\'ecution, les autres sont entr\'ees au clavier.
Pour simplifier, on n'utilise que des minuscules non accentu\'ees.) :
\parm
\line{
\vtop{\hsize=6cm 
\tt
verbe es ai prends mange \par
nom pain pomme main table\par
je prends une pomme sur la table\par
> je : inconnu\par
> prends : verbe\par
> une : inconnu\par
> pomme : nom\par
> sur : inconnu\par
> la : inconnu\par
> table : nom\par
pronom : je tu il, le la les\par
}
\hfill
\vtop{\hsize=6cm 
{\sl (suite)}\par
\tt
article un une, le la les\par
je prends le pain et je le mange\par
> je : pronom\par
> prends : verbe\par
> le : article pronom\par
> pain : nom\par
> et : inconnu\par
> je : pronom\par
> le : article pronom\par
> mange : verbe\par
}
}
\parm
Et ainsi de suite \dots\ Il faut pr\'evoir une sortie honorable.
%%%%%%%
\puce Le nom d'une classe grammaticale ({\tt verbe}, {\tt nom}, {\tt pronom}, \dots), {\bf plac\'e
en d\'ebut de ligne}, provoque le rangement dans la table des mots qui suivent 
(chaque mot ainsi rang\'e doit \^etre accompagn\'e de la classe qui vient de lui \^etre attribu\'ee).
\puce Dans les autres cas, chaque mot d'une ligne entr\'ee au clavier sera recherch\'e
dans la table (telle qu'elle se pr\'esente \`a ce moment) et sera affich\'e \`a l'\'ecran avec le r\'esultat
de cette recherche.
\parb
Voici quelques indications qui vous seront utiles pour \'ecrire un programme LEX r\'ealisant ces op\'erations :
\parm
{\tt
Type
\pars
{\parindent 2.5cm
\item{Classes =} ( recherche,\hfill (* classe ``\`a d\'eterminer'' *) \par
article, nom, pronom, verbe, adjectif,\par
conjonction, \hfill (* et, mais, ou, car, donc, \dots *)\par
preposition \hfill (* a (\`a), en, de, \dots *)\par
\item{ } ) ;\par
}
\pars
{\parindent 2.5cm
\item{MotCl =} record \par
\itemitem{mot :} string ; \hfill (* le mot *)\par
\itemitem{classe :} Classes \hfill (* sa classe *)\par
\item{} end ;\par
}
\parm
Var
\pars
{\parindent 2.5cm
\item{mode :} Classes ;\par
\item{table :} array[1..Max] of MotCl ;\par
\item{ltable :} integer ; \hfill (* longueur effective de la table <= Max *)\par
}
\parb
\bib{procedure ranger( c : Classes ; m : string ) ; }{%
(* tente de ranger le \par
\item{} mot m de classe c dans la table. Ce mot peut \^etre :\par
\item{} - nouveau,\par
\item{} - d\'ej\`a dans la table mais dans une autre classe,\par
\item{} - d\'ej\`a dans la table et dans la m\^eme classe.\par
\item{} Dans ce dernier cas, la table n'est pas modifi\'ee, sinon, il faut \par
\item{} effectivement y ranger le couple c, m. *)
\par
}
\pars
\bib{procedure rechercher( m : string ) ; }{%
(* recherche le mot m dans la\par
\item{} table, l'affiche ainsi que les classes auxquelles
il appartient\par 
\item{} ou la mention inconnu lorsque m ne figure pas dans la table. *)\par
}
}%fin de \tt
\parb
{\tt
\%\accg\par
\hskip 2cm (* d\'eclarations Turbo Pascal utilis\'ees dans yylex *)\par
\%\accd\par
\dots\par
\%\%\par
\dots\hfill (* prevoir une sortie \dots *)\par
\dl article\kern 1em mode := article ;\par
\dots\par
[a-z]+ \kern 1em if mode = recherche then rechercher( yytext )\par
\ \kern 4em else ranger( mode, yytext ) ;\par
\dots\par
\echap n \kern 3em mode := recherche ;\par
.\kern 4em writeln( yytext , ' n''est pas valide.' ) ;\par
\%\%\par
begin\par
\hskip 2cm mode := recherche ; \par
\hskip 2cm yylex\par
end.\par
}
\exo
Ecrire, compiler et tester un programme obtenu par LEX sur le mod\`ele pr\'ec\'edent,
en d\'efinissant la table des symboles comme un tableau.
\exot{\sl (pour les amateurs de pointeurs)}
 Idem, en d\'efinissant la table comme une liste cha\^\i n\'ee ({\tt ranger} dans l'ordre alphab\'etique).






\bye