\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--m�me 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 commen�ant 
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 m�me 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 mod�le 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


