From ed9dcfac0bd24c21333f25cca9231ce00f42aee8 Mon Sep 17 00:00:00 2001 From: "David A. Madore" Date: Tue, 24 Jan 2017 14:46:13 +0100 Subject: Systematically use English names for nonterminals; also replace "unary" by "factor". (Akim's suggestion.) 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; } } diff --git a/tp2.tex b/tp2.tex index 7ae17dd..b37af69 100644 --- a/tp2.tex +++ b/tp2.tex @@ -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\\ -- cgit v0.10.2