diff options
| -rw-r--r-- | tp2-files/Calculatrice-final.jj | 40 | ||||
| -rw-r--r-- | tp2.tex | 92 | 
2 files changed, 66 insertions, 66 deletions
| diff --git a/tp2-files/Calculatrice-final.jj b/tp2-files/Calculatrice-final.jj index 9a03f39..a7ea9f0 100644 --- a/tp2-files/Calculatrice-final.jj +++ b/tp2-files/Calculatrice-final.jj @@ -37,47 +37,47 @@ void boucle():  }  // Expression (axiome de la grammaire de la calculatrice) -//     expression → terme ( "+" terme | "-" terme )* +//     expression → term ( "+" term | "-" term )*  double expression():  { double a,b; }  { -    a=terme() +    a=term()      ( -      "+" b=terme() { a += b; } -    | "-" b=terme() { a -= b; } +      "+" b=term() { a += b; } +    | "-" b=term() { a -= b; }      )* { return a; }  } -// Terme d'une somme ou différence -//     terme → unaire ( "*" unaire | "/" unaire )* -double terme(): +// Term d'une somme ou différence +//     term → factor ( "*" factor | "/" factor )* +double term():  { double a,b; }  { -    a=unaire() +    a=factor()      ( -      "*" b=unaire() { a *= b; } -    | "/" b=unaire() { a /= b; } +      "*" b=factor() { a *= b; } +    | "/" b=factor() { a /= b; }      )* { return a; }  } -// Gestion du "+" et "−" unaires -//     unaire → puissance | "+" puissance | "-" puissance -double unaire(): +// Gestion du "+" et "−" factors +//     factor → power | "+" power | "-" power +double factor():  { double a; }  { -    a=puissance() { return a; } -|   "+" a=puissance() { return a; } -|   "-" a=puissance() { return -a; } +    a=power() { return a; } +|   "+" a=power() { return a; } +|   "-" a=power() { return -a; }  } -// Opération puissance (associative à droite) -//     puissance → element ( "^" unaire )? -double puissance(): +// Opération power (associative à droite) +//     power → element ( "^" factor )? +double power():  { double a,b; }  {      a=element()      ( -      "^" b=unaire() { a = Math.pow(a,b); } +      "^" b=factor() { a = Math.pow(a,b); }      )? { return a; }  } @@ -169,7 +169,7 @@ Modifier la grammaire pour avoir une priorité correcte des opérations  (\texttt{*} et \texttt{/} doivent être prioritaires sur \texttt{+} et  \texttt{-}, et en particulier \texttt{3+4*5} doit  renvoyer \texttt{23.0}).  Pour cela, on peut par exemple introduire un -nouveau nonterminal $\mathit{terme}$ représentant un terme d'une somme +nouveau nonterminal $\mathit{term}$ représentant un terme d'une somme  ou différence, et qui est lui-même formé de produits ou quotients.  Tester la calculatrice ainsi modifiée. @@ -185,17 +185,17 @@ Pour corriger ce problème, on va modifier la grammaire de la manière  suivante :  \[  \begin{aligned} -\mathit{expression} & \rightarrow \mathit{terme} \; -( \ldquote\hbox{\texttt{+}}\rdquote \mathit{terme} -\,|\, \ldquote\hbox{\texttt{-}}\rdquote \mathit{terme}){*}\\ -\mathit{terme} & \rightarrow \mathit{element} \; +\mathit{expression} & \rightarrow \mathit{term} \; +( \ldquote\hbox{\texttt{+}}\rdquote \mathit{term} +\,|\, \ldquote\hbox{\texttt{-}}\rdquote \mathit{term}){*}\\ +\mathit{term} & \rightarrow \mathit{element} \;  (\ldquote\hbox{\texttt{*}}\rdquote \mathit{element}  \,|\, \ldquote\hbox{\texttt{/}}\rdquote \mathit{element}  ){*}\\  \end{aligned}  \]  (le reste est inchangé) : ceci forcera l'arbre d'analyse de -\texttt{3+4*5} à comporter deux $\mathit{terme}$, en l'occurrence +\texttt{3+4*5} à comporter deux $\mathit{term}$, en l'occurrence  \texttt{3} et \texttt{4*5}, qui s'évalueront dans les bonnes valeurs.  Voici à quoi peut ressembler le code JavaCC modifié pour refléter la @@ -204,14 +204,14 @@ grammaire en question :  double expression():  { double a,b; }  { -    a=terme() +    a=term()      ( -      "+" b=terme() { a += b; } -    | "-" b=terme() { a -= b; } +      "+" b=term() { a += b; } +    | "-" b=term() { a -= b; }      )* { return a; }  } -double terme(): +double term():  { double a,b; }  {      a=element() @@ -264,35 +264,35 @@ renvoyer \texttt{-3.0}.  Vérifier que le moins unaire marche aussi  devant les parenthèses : par exemple, \texttt{-(2+3)} doit  renvoyer \texttt{-5.0}.  On pourra aussi ajouter le $+$ unaire (qui ne  change pas le nombre).  Pour cela, on pourra introduire un nouveau -nonterminal $\mathit{unaire}$ représentant un élément éventuellement +nonterminal $\mathit{factor}$ représentant un élément éventuellement  précédé d'un $-$ (ou d'un $+$) unaire.  \begin{corrige}  On modifie la grammaire comme suit :  \[  \begin{aligned} -\mathit{terme} & \rightarrow \mathit{unaire} \; -(\ldquote\hbox{\texttt{*}}\rdquote \mathit{unaire} -\,|\, \ldquote\hbox{\texttt{/}}\rdquote \mathit{unaire} +\mathit{term} & \rightarrow \mathit{factor} \; +(\ldquote\hbox{\texttt{*}}\rdquote \mathit{factor} +\,|\, \ldquote\hbox{\texttt{/}}\rdquote \mathit{factor}  ){*}\\ -\mathit{unaire} & \rightarrow \mathit{element} \; +\mathit{factor} & \rightarrow \mathit{element} \;  \,|\, \ldquote\hbox{\texttt{+}}\rdquote \mathit{element}  \,|\, \ldquote\hbox{\texttt{-}}\rdquote \mathit{element}\\  \end{aligned}  \]  et le code JavaCC correspondant pourrait être :  \begin{verbatim} -double terme(): +double term():  { double a,b; }  { -    a=unaire() +    a=factor()      ( -      "*" b=unaire() { a *= b; } -    | "/" b=unaire() { a /= b; } +      "*" b=factor() { a *= b; } +    | "/" b=factor() { a /= b; }      )* { return a; }  } -double unaire(): +double factor():  { double a; }  {      a=element() { return a; } @@ -302,7 +302,7 @@ double unaire():  \end{verbatim}  (Plusieurs variations sont possibles : par exemple, si on fait suivre -le \texttt{-} unaire d'un $\mathit{unaire}$ au lieu d'un +le \texttt{-} unaire d'un $\mathit{factor}$ au lieu d'un  $\mathit{element}$, cela permet d'autoriser \texttt{-{}-3} comme façon  d'écrire \texttt{+3}.)  \end{corrige} @@ -329,37 +329,37 @@ $\hbox{\texttt{2*3\char"5E\relax 2*3}} \rightsquigarrow \texttt{54.0}$.  \begin{corrige}  Pour obtenir l'associativité \emph{à droite}, on va définir un -nonterminal $\mathit{puissance}$ pour lequel on va définir une -production faisant qu'une $\mathit{puissance}$ peut s'analyser comme +nonterminal $\mathit{power}$ pour lequel on va définir une +production faisant qu'une $\mathit{power}$ peut s'analyser comme  un $\mathit{element}$ suivi d'un ``$\texttt{\char"5E}$'' suivi -facultativement d'une nouvelle $\mathit{puissance}$, c'est-à-dire +facultativement d'une nouvelle $\mathit{power}$, c'est-à-dire  qu'on modifie la grammaire ainsi :  \[  \begin{aligned} -\mathit{unaire} & \rightarrow \mathit{puissance} \; -\,|\, \ldquote\hbox{\texttt{+}}\rdquote \mathit{puissance} -\,|\, \ldquote\hbox{\texttt{-}}\rdquote \mathit{puissance}\\ -\mathit{puissance} & \rightarrow \mathit{element} -( \ldquote\hbox{\texttt{\char"5E}}\rdquote \mathit{unaire} +\mathit{factor} & \rightarrow \mathit{power} \; +\,|\, \ldquote\hbox{\texttt{+}}\rdquote \mathit{power} +\,|\, \ldquote\hbox{\texttt{-}}\rdquote \mathit{power}\\ +\mathit{power} & \rightarrow \mathit{element} +( \ldquote\hbox{\texttt{\char"5E}}\rdquote \mathit{factor}  ){?}\\  \end{aligned}  \]  avec le code JavaCC suivant :  \begin{verbatim} -double unaire(): +double factor():  { double a; }  { -    a=puissance() { return a; } -|   "+" a=puissance() { return a; } -|   "-" a=puissance() { return -a; } +    a=power() { return a; } +|   "+" a=power() { return a; } +|   "-" a=power() { return -a; }  } -double puissance(): +double power():  { double a,b; }  {      a=element()      ( -      "^" b=unaire() { a = Math.pow(a,b); } +      "^" b=factor() { a = Math.pow(a,b); }      )? { return a; }  }  \end{verbatim} @@ -367,18 +367,18 @@ double puissance():  Voici la grammaire finale :  \[  \begin{aligned} -\mathit{expression} & \rightarrow \mathit{terme} \; -( \ldquote\hbox{\texttt{+}}\rdquote \mathit{terme} -\,|\, \ldquote\hbox{\texttt{-}}\rdquote \mathit{terme}){*}\\ -\mathit{terme} & \rightarrow \mathit{unaire} \; -(\ldquote\hbox{\texttt{*}}\rdquote \mathit{unaire} -\,|\, \ldquote\hbox{\texttt{/}}\rdquote \mathit{unaire} +\mathit{expression} & \rightarrow \mathit{term} \; +( \ldquote\hbox{\texttt{+}}\rdquote \mathit{term} +\,|\, \ldquote\hbox{\texttt{-}}\rdquote \mathit{term}){*}\\ +\mathit{term} & \rightarrow \mathit{factor} \; +(\ldquote\hbox{\texttt{*}}\rdquote \mathit{factor} +\,|\, \ldquote\hbox{\texttt{/}}\rdquote \mathit{factor}  ){*}\\ -\mathit{unaire} & \rightarrow \mathit{puissance} \; -\,|\, \ldquote\hbox{\texttt{+}}\rdquote \mathit{puissance} -\,|\, \ldquote\hbox{\texttt{-}}\rdquote \mathit{puissance}\\ -\mathit{puissance} & \rightarrow \mathit{element} -( \ldquote\hbox{\texttt{\char"5E}}\rdquote \mathit{unaire} +\mathit{factor} & \rightarrow \mathit{power} \; +\,|\, \ldquote\hbox{\texttt{+}}\rdquote \mathit{power} +\,|\, \ldquote\hbox{\texttt{-}}\rdquote \mathit{power}\\ +\mathit{power} & \rightarrow \mathit{element} +( \ldquote\hbox{\texttt{\char"5E}}\rdquote \mathit{factor}  ){?}\\  \mathit{element} &\rightarrow \mathit{Number}  \,|\, \ldquote\hbox{\texttt{(}}\rdquote \mathit{expression} \ldquote\hbox{\texttt{)}}\rdquote\\ | 
