Autour des expressions mathématique simple, pour montrer les design pattern
- Composite,
- Visiteur,
- Template,
- Strategie,
- Interpreteur,
- Factory
- MAJUSCULE GRAS : non terminal sera modélisé par une Classe
- minuscule gras : un presque terminal (par exemple operation qui est en fait une des string +, - , ...) qui est un non Terminal mais nous le considérerons dans notre exemple comme un caractère spécial pouvant prendre une valeurs parmi plusieurs.
- minuscule : terminal exemple nombre, symbole, caractère spécial, ...
- EXPRESSION ::= CONST | ExpressionB
- CONST ::= nombre entier
- op ::= + | - | * | /
- ExpressionB ::= (EXPRESSION op EXPRESSION)
ou (à la place de 3, 4)
- ExpressionB ::= ( ADD | SOUS | MULT | DIV )
- ADD ::= EXPRESSION + EXPRESSION
- SOUS ::= EXPRESSION - EXPRESSION
- MULT ::= EXPRESSION * EXPRESSION
- DIV ::= EXPRESSION / EXPRESSION
- Faire clone du projet
- Après le clone git checkout V0.1 (attention V0.1 n'est pas une branche mais un commit historique)
- Ouvrir dans bluej le projet se trouvant `dans le repertoire /ExpMath/src/main/java
NONTERMINALGAUCHE ::= NTDROIT1 | NTDROIT2 | ... | NTDROITi
Est traduit avec le design pattern composite ainsi
Les non terminaux disparaissent en principe, ne servent que pour aider la syntaxe. Nous verrons qu'il permettront de choisir quoi faire seront utile pour construire un arbre syntaxique abstrait ou traduire : design pattern factory et startegy
ExpressionB ::= (EXPRESSION op EXPRESSION)
On applique la composition (pas le design pattern mais la composition d'objets)
class ExpressionB {
Expression e1;
Op op;
Expression e2;
//.....
}
==> Regardez ce que tout ceci donne en première version: ouvrir dans blueJ /ExpMath/src/main/java
-
Que représente la méthode dans les classes du genre?
public static Type create(parametres) { ... }
-
D'après vous pourquoi le constructeur est private?
-
A quoi sert de réécrire les méthodes equal() et hashcode() ?
-
qui crée l'expression suivante
(((3 -5) + 6) +8)
puis lui appliquer les 3 méthodes eval(), evalnum() et show() -
Excrire les 2 classes qui manques Mult et Div
=== //TODO la prochaine fois
- Appliquer le pattern visiteurs pour simplifier les différente évaluation
- Appliquer un méthode inspiré de la descente récursive pour faire le parsing du langage Expression math et générer l'AST
- Réfléchir aux différentes améliorations possible