From bcc113e0355f17834cbc3e14d6ae9781347fa8e1 Mon Sep 17 00:00:00 2001 From: "David A. Madore" Date: Tue, 24 Jan 2017 15:02:10 +0100 Subject: Additional explanations, including one on why implementing optional power uses the '?' metacharacter. --- tp2.tex | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/tp2.tex b/tp2.tex index 4137561..31b0b12 100644 --- a/tp2.tex +++ b/tp2.tex @@ -145,9 +145,9 @@ Initialement, la grammaire de la calculatrice définie dans \] Il s'agit d'une grammaire « étendue » au sens où le membre de droite des règles de production autorise l'utilisation des métacaractères -${*}$, ${+}$ et ${?}$ des expressions rationnelles — pour désigner -respectivement un nombre quelconque de répétitions, au moins une -répétition, ou au plus une répétition. En principe, on pourrait +« ${*}$ », « ${+}$ » et « ${?}$ » des expressions rationnelles — pour +désigner respectivement un nombre quelconque de répétitions, au moins +une répétition, ou un groupe facultatif. En principe, on pourrait éliminer l'utilisation de ces métacaractères en s'inspirant de la manière dont on démontre que tout langage rationnel est algébrique (par exemple $X\rightarrow Y{*}$ peut être remplacé par $X\rightarrow @@ -318,12 +318,17 @@ veut qu'elle soit associative \emph{à droite}, c'est-à-dire par exemple que \texttt{2\char"5E\relax 3\char"5E\relax 2} doit calculer $2^{3^2} = 2^9 = 512$. +On pourra pour cela introduire un nouveau nonterminal $\mathit{power}$ +représentant un $\mathit{element}$ suivi facultativement d'un +\texttt{\char"5E} et d'un nouveau $\mathit{power}$. + La méthode Java permettant de calculer $a^b$ s'écrit \texttt{Math.pow(a,b)}. Tester notamment les calculs suivants : $\hbox{\texttt{2\char"5E\relax 3\char"5E\relax 2}} \rightsquigarrow \texttt{512.0}$ ; $\hbox{\texttt{-1\char"5E\relax 2}} \rightsquigarrow \texttt{-1.0}$ ; $\hbox{\texttt{(-1)\char"5E\relax 2}} \rightsquigarrow \texttt{1.0}$ ; +$\hbox{\texttt{(2+3)\char"5E\relax 2}} \rightsquigarrow \texttt{25.0}$ ; $\hbox{\texttt{2\char"5E\relax -1}} \rightsquigarrow \texttt{0.5}$ ; $\hbox{\texttt{2*3\char"5E\relax 2*3}} \rightsquigarrow \texttt{54.0}$. @@ -364,6 +369,21 @@ double power(): } \end{verbatim} +Remarquez l'utilisation du métacaractère « $?$ » pour marquer le +caractère facultatif de la partie +$\ldquote\hbox{\texttt{\char"5E}}\rdquote \mathit{factor}$ ; on aurait +pu tenter d'écrire la règle sous la forme $\mathit{power} \rightarrow +\mathit{element} \;|\; \mathit{element} +\ldquote\hbox{\texttt{\char"5E}}\rdquote \mathit{factor}$ pour un code +JavaCC qui ressemblerait à « \texttt{\{ a=element() \{ return a; \} + |\penalty-100\hskip.5emplus1em a=element() "\char"5E" b=factor() + \{ return Math.pow(a,b); \} \}} », mais ce code fait échouer +JavaCC car au moment où il reconnaît le nonterminal +$\mathit{element}$, l'analyseur ne peut pas encore savoir dans quelle +branche de l'alternative il sera. + +\smallbreak + Voici la grammaire finale : \[ \begin{aligned} @@ -389,7 +409,7 @@ Voici la grammaire finale : \end{aligned} \] -Le code JavaCC correspondant peut se trouve à l'adresse +Le code JavaCC correspondant peut se trouver à l'adresse \url{http://perso.enst.fr/~madore/inf105/Calculatrice-final.jj} \end{corrige} -- cgit v1.2.3