\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 troisime 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 troisime 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 entire,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 caractre, 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 considre 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 caractre $1$.\bye