Si l'on veut évaluer les expressions, encore faut-il savoir à quoi
correspondent les terminaux. Ainsi, dans notre exemple, il faut
savoir que les symboles
@v et
@f correspondent aux
valeurs de vérité -- mais quelles valeurs de vérité? -- et que les
symboles
@ou,
@et, et
@non correspondent
respectivement à la disjonction, la conjonction et la négation.
Ainsi doit-on utiliser cinq fonctions, qui constituent la barrière
d'interprétation du langage:
;;;
;;;
;;;
;;;
;;;
;;;
;;;
;;;
;;;
;;;
Implantations de la barrière d'interprétation
Donnons une première implantation, dans les booléens Scheme:
;;;;
(define (faux)
#f)
(define (vrai)
#t)
(define (faux? b)
(not b))
(define (vrai? b)
b)
(define (non b)
(not b))
(define (et b1 b2)
(and b1 b2))
(define (ou b1 b2)
(or b1 b2))
Noter l'implantation des opérations qui sont des fonctions
qui retournent une fonction.
Une autre implantation, en prenant comme valeurs booléennes les
symboles
@v et
@f:
;;;;
(define (faux) '@f)
(define (vrai) '@v)
(define (faux? b)
(equal? b '@f))
(define (vrai? b)
(equal? b '@v))
(define (non b)
(if (equal? b '@f) '@v '@f))
(define (et b1 b2)
(if (and (equal? b1 '@v) (equal? b2 '@v)) '@v '@f))
(define (ou b1 b2)
(if (or (equal? b1 '@v) (equal? b2 '@v)) '@v '@f))
Nous avons spécifié toutes les fonctions nécessaires à l'écriture de
la fonction
ebs-eval-expr-cste qui a comme spécification:
;;;
;;;
En effet, voici une définition de cette fonction:
(define (ebs-eval-expr-cste exp)
(cond ((ebs-constante? exp)
(ebs-eval-constante exp))
((ebs-unaire? exp)
(ebs-eval-unaire exp))
((ebs-binaire? exp)
(ebs-eval-binaire exp))
(else (erreur 'ebs-eval-cste "expression mal formée"))))
;;;
;;;
(define (ebs-eval-constante cste)
(if (ebs-constante-vrai? cste)
(vrai)
(faux)))
;;;
;;;
(define (ebs-eval-unaire exp)
(let ((operateur (ebs-unaire-operateur exp))
(operande (ebs-unaire-operande exp)))
(if (ebs-operateur1-non? operateur)
(non (ebs-eval-expr-cste operande))
(erreur 'ebs-eval-unaire operateur "n'est pas un opérateur unaire"))))
;;;
;;;
(define (ebs-eval-binaire exp)
(let ((operateur (ebs-binaire-operateur exp))
(operandeG (ebs-binaire-operande-gauche exp))
(operandeD (ebs-binaire-operande-droit exp)))
(cond ((ebs-operateur2-et? operateur)
(et
(ebs-eval-expr-cste operandeG)
(ebs-eval-expr-cste operandeD)))
((ebs-operateur2-ou? operateur)
(ou
(ebs-eval-expr-cste operandeG)
(ebs-eval-expr-cste operandeD)))
(else (erreur 'ebs-eval-binaire operateur
"n'est pas un opérateur binaire")))))
Remarque très importante: noter que cette définition est
valable quel que soit le langage utilisé (préfixe, infixe...).