Beaucoup de code. mais si vous avez compris la première partie. cela devrait aller.
Expression Booléenne
Nous définissons l’interface suivante.
1234567891011121314151617
/** * Une expression Booléenne */interfaceBoolExpression{publicfunctionaccept(VisitorBoolExpression$v);}/** * Une classe abstraite. */abstractclassUnaryimplementsBoolExpression{publicfunctionaccept(VisitorBoolExpression$v){return$v->visit($this);}}
Pour faire l’algèbre booléen j’ai besoin de False et de True
// Or et And sont des mots réservés en Php.classBinaryOrextendsBinary{}classBinaryAndextendsBinary{}classBinaryNandextendsBinary{}classBinaryNorextendsBinary{}
$memory=newMemory();$memory->write('i',10);$ve=newVisitorBoolPrint($memory);// une expression$expression=newTrue();// appelle le visiteurvar_dump($expression->accept($ve))// affiche true;$expression=newNot(newFalse());var_dump($expression->accept($ve))// affiche !false;$expression=newBinaryAnd(newNot(newFalse()),newBinaryOr(newTrue(),newFalse()));var_dump($expression->accept($ve))//Affiche (!false&&(true||false));
Les comparaisons
Nous pouvons rajouter le ==, !=, > , < !
ajoutons de nouveau objet. les object prennent en entrée des expressions mais sortent des boléens.
1234567891011121314151617181920212223242526
classBinaryComparaisonextendsUnary{private$left;private$right;publicfunction__construct(Expression$left,Expression$right){$this->left=$left;$this->right=$right;}publicfunctiongetLeft(){return$this->left;}publicfunctiongetRight(){return$this->right;}}classEqualextendsBinaryComparaison{}classNotEqualextendsBinaryComparaison{}//Greater Than EqualclassGteextendsBinaryComparaison{}// Lesser Than EqualclassLteextendsBinaryComparaison{}// Lesser ThanclassLtextendsBinaryComparaison{}// Greater ThanclassGtextendsBinaryComparaison{}
Pour mon visiteur je vais utiliser mon visiteur d’expression du post précédent.
Le visiteur booléen utilise un autre visiteur pour évaluer une expression.
Un exemple d’utilisation
123456789
$memory=newMemory();$memory->write('i',10);// une visiteur d'expression$ve=newVisitorEvaluation($memory);// un visiteur pour les expressions booléennes$vb=newVisitorBoolEvaluation($memory,$ve);// une expression$expression=newNot(newEqual(newConstant(10),newAddition(newConstant(5),newVariable('i'))));var_dump($expression->accept($vb));// affiche bool(true)
si je reprend mon autre visiteur VisitorToPhp avec le visitorBoolPrint
1234567
$memory=newMemory();$memory->write('i',10);$ve=newVisitorToPhp($memory);$vb=newVisitorBoolPrint($memory,$ve);// une expression$expression=newNot(newEqual(newConstant(10),newAddition(newConstant(5),newVariable('i'))));var_dump($expression->accept($vb));//affiche "!(10==(5+$i))"
Une conclusion.
Dans le premier post : On a vu le visiteur pour évaluer/afficher des expressions.
dans le second post : le visiteur pour les expressions booléennes et les comparaisons. Celui-ci utilise le premier visiteur pour faire les calculs.
dans un prochain post, je vais montrer un troisième visiteur visitorInstruction pour évaluer des instructions d’un langage très simple. Mais cela est un peu long à écrire. Il y a un peu de théorie et des figures à faire.