
\input mias

\TP 4
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{\sl 
LEX est un g\'en\'erateur d'analyseur lexical,
YACC un g\'en\'erateur d'analyseur syntaxique. 
\pars
Un analyseur syntaxique a besoin des services d'un analyseur lexical : nous en prendrons un qui est 
engendr\'e 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\'etiques.}
Ceci est un exercice d'observation du contenu des fichiers {\tt EXPR.Y} et {\tt EXPRLEX.L} et de l'ex\'ecution 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\'ecessaire au pr\'ec\'edent : 
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\'ecutable {\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\'ebut de la troisi\`eme 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 \`a YACC de construire une fonction {\tt yyparse} : 
la troisi\`eme section de ce programme fait essentiellement un appel \`a cette fonction.
\puce Il revient \`a la fonction {\tt yyparse} de faire appel \`a {\tt yylex} mais un programme YACC n'y fait jamais appel explicitement.
\puce De son c™t\'e, la fonction {\tt yylex}  rend la main au moyen de l'une des proc\'edures de retour suivantes:
\pars
{\parindent 1cm
\item{--} {\tt return ( n )} : 
la valeur retourn\'ee {\tt n} est celle d'un {\tt token} : en fait, un token est une constante enti\`ere,
qui d\'esigne une unit\'e lexicale, \par 
\itemitem{} par exemple {\tt return ( NUM )}.\par
\item{--} {\tt returnc ( c )} : la valeur retourn\'ee {\tt c} est (le code ASCII d') un caract\`ere, constituant 
une unit\'e lexicale \`a 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\'ee par une erreur \`a l'ex\'ecution \dots). 
\exo
On consid\`ere la grammaire inspir\'ee 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\'eterminer si une expression est valide
pour cette grammaire et de calculer la valeur num\'erique correspondante. 
(pour pallier l'ambigu\"\i t\'e de cette grammaire vous devrez peut--\^etre d\'efinir des degr\'es de pr\'ec\'edence 
et des modes d'association pour les op\'erations  $*$ 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 \`a relancer {\tt BAT.EXE} plusieurs fois.
\exo Reprendre l'exercice pr\'ec\'edent 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\`u ${\bf id}$ est un terminal repr\'esentant l'unit\'e lexicale des cha\^\i nes non vides d'occurren\-ces du caract\`ere $1$.





\bye