\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ŽcŽdent, on introduisait, dans le programme LEX lui--mme des listes de motsˆ chacune desquelles Žtait associŽe une classe grammaticale. Le prŽsent sujetremplace la donnŽe {\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Žcutiondu programme que l'on se propose d'obtenir (Les lignes commenant par {\tt >}  sont le rŽsultat de l'exŽcution, les autres sont entrŽes au clavier.Pour simplifier, on n'utilise que des minuscules non accentuŽes.) :\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Žvoir une sortie honorable.%%%%%%%\puce Le nom d'une classe grammaticale ({\tt verbe}, {\tt nom}, {\tt pronom}, \dots), {\bf placŽen dŽbut de ligne}, provoque le rangement dans la table des mots qui suivent (chaque mot ainsi rangŽ doit tre accompagnŽ de la classe qui vient de lui tre attribuŽe).\puce Dans les autres cas, chaque mot d'une ligne entrŽe au clavier sera recherchŽdans la table (telle qu'elle se prŽsente ˆ ce moment) et sera affichŽ ˆ l'Žcran avec le rŽsultatde cette recherche.\parbVoici quelques indications qui vous seront utiles pour Žcrire un programme LEX rŽalisant ces opŽrations :\parm{\ttType\pars{\parindent 2.5cm\item{Classes =} ( recherche,\hfill (* classe ``ˆ dŽterminer'' *) \pararticle, nom, pronom, verbe, adjectif,\parconjonction, \hfill (* et, mais, ou, car, donc, \dots *)\parpreposition \hfill (* 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 tre :\par\item{} - nouveau,\par\item{} - dŽjˆ dans la table mais dans une autre classe,\par\item{} - dŽjˆ dans la table et dans la mme classe.\par\item{} Dans ce dernier cas, la table n'est pas modifiŽe, 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Žclarations Turbo Pascal utilisŽes 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 modle prŽcŽdent,en dŽfinissant la table des symboles comme un tableau.\exot{\sl (pour les amateurs de pointeurs)} Idem, en dŽfinissant la table comme une liste cha”nŽe ({\tt ranger} dans l'ordre alphabŽtique).\bye