summaryrefslogtreecommitdiffstats
path: root/tp2.tex
diff options
context:
space:
mode:
authorDavid A. Madore <david+git@madore.org>2017-01-24 15:02:10 +0100
committerDavid A. Madore <david+git@madore.org>2017-01-24 15:02:10 +0100
commitbcc113e0355f17834cbc3e14d6ae9781347fa8e1 (patch)
treef771f9030db3e81e0cc93cc9e5c7b9ecb50ce446 /tp2.tex
parent9dc8b13f469d4e945a49384c1273a98dc3fbf28a (diff)
downloadinf105-bcc113e0355f17834cbc3e14d6ae9781347fa8e1.tar.gz
inf105-bcc113e0355f17834cbc3e14d6ae9781347fa8e1.tar.bz2
inf105-bcc113e0355f17834cbc3e14d6ae9781347fa8e1.zip
Additional explanations, including one on why implementing optional power uses the '?' metacharacter.
Diffstat (limited to 'tp2.tex')
-rw-r--r--tp2.tex28
1 files 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}