
\input MIAS

\TP 4
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{\sl 
LEX est un g�n�rateur d'analyseur lexical,
YACC un g�n�rateur d'analyseur syntaxique. 
\pars
Un analyseur syntaxique a besoin des services d'un analyseur lexical : nous en prendrons un qui est 
engendr� par LEX !
\parm
Vous devez consulter
 `TP LEX and YACC User Manual'
ainsi que le contenu de {\tt LEXLIB.PAS} et {\tt YACCLIB.PAS}.
}
\par\vskip 1cm
\exot{Expressions aritm�tiques.}
Ceci est un exercice d'observation du contenu des fichiers {\tt EXPR.Y} et {\tt EXPRLEX.L} et de l'ex�cution du programme 
{\tt EXP.EXE} :
\pars
 {\parindent 1cm
\item{--} {\tt EXPR.Y} est la description, dans le format YACC, d'un analyseur syntaxique : le programme {\tt EXPR.PAS}
lui correspondant est obtenu par la commande \par
\itemitem{} {\tt YACC EXPR}\pars
\item{--} {\tt EXPRLEX.L} est la description, dans le format LEX, d'un analyseur lexical n�cessaire au pr�c�dent : 
le programme {\tt EXPRLEX.PAS} lui correspondant est obtenu par la commande \par
\itemitem{} {\tt LEX EXPRLEX}\pars
\item{--} Enfin, on obtient le programme ex�cutable {\tt EXPR.EXE} par la commande \par
\itemitem{} {\tt TPC EXPR}\pars
}
\remm
Remarques.
\endrem
\puce C'est la directive de compilation {\tt \accg\$I EXPRLEX\accd}  qui figure au d�but de la troisi�me section de {\tt EXPR.Y} 
qui provoquera l'inclusion du contenu du fichier {\tt EXPRLEX.PAS}, lors de la compilation de {\tt EXPR.PAS}.
\puce Le fichier {\tt EXPR.Y} permettra � YACC de construire une fonction {\tt yyparse} : 
la troisi�me section de ce programme fait essentiellement un appel � cette fonction.
\puce Il revient � la fonction {\tt yyparse} de faire appel � {\tt yylex} mais un programme YACC n'y fait jamais appel explicitement.
\puce De son c�t�, la fonction {\tt yylex}  rend la main au moyen de l'une des proc�dures de retour suivantes:
\pars
{\parindent 1cm
\item{--} {\tt return ( n )} : 
la valeur retourn�e {\tt n} est celle d'un {\tt token} : en fait, un token est une constante enti�re,
qui d�signe une unit� lexicale, \par 
\itemitem{} par exemple {\tt return ( NUM )}.\par
\item{--} {\tt returnc ( c )} : la valeur retourn�e {\tt c} est (le code ASCII d') un caract�re, constituant 
une unit� lexicale � lui seul, \par 
\itemitem{} par exemple {\tt returnc ( yytext[1] )}.
\par
}
Pour comprendre le fonctionnement des analyseurs, vous testerez {\tt EXPR.EXE} sur plusieurs exemples de votre choix (attention,
toute tentative de division par {\tt 0} sera sanctionn�e par une erreur � l'ex�cution \dots). 
\exo
On consid�re la grammaire inspir�e de l'exercice 3 du TD 1 : 
\pars
\line{\hfill
\initr
\vtop{\hsize 4cm 
\r{S\donne S * S}\par
\r{S\donne S + S}\par
\r{S\donne T}
}
\kern 1cm
\vtop{\hsize 4cm 
\r{T\donne T\kern .2em 1}\par
\r{T\donne 1}\par
}
\hfill
}
\parm
Ecrivez des progammes {\tt BATLEX.L}  et {\tt BAT.Y} capables d'engendrer un programme permettant de d�terminer si une expression est valide
pour cette grammaire et de calculer la valeur num�rique correspondante. 
(pour pallier l'ambigu�t� de cette grammaire vous devrez peut--�tre d�finir des degr�s de pr�c�dence 
et des modes d'association pour les op�rations  $*$ et $+$).
\parm
Vous  introduirez un nouveau non terminal {\tt input}, comme il est fait dans {\tt EXPR.Y}, 
afin de pouvoir effectuer plusieurs essais de calcul sans avoir � relancer {\tt BAT.EXE} plusieurs fois.
\exo Reprendre l'exercice pr�c�dent pour la grammaire suivante :
\parm
\line{\hfill
\initr
\vtop{\hsize 4cm 
\r{S\donne S * S}\par
\r{S\donne S + S}\par
\r{S\donne {\bf id}}
}
\hfill
}
\parm
o� ${\bf id}$ est un terminal repr�sentant l'unit� lexicale des cha�nes non vides d'occurren\-ces du caract�re $1$.





\bye



