From bcc113e0355f17834cbc3e14d6ae9781347fa8e1 Mon Sep 17 00:00:00 2001
From: "David A. Madore" <david+git@madore.org>
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(-)

(limited to 'tp2.tex')

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

