On se propose de réaliser en Scheme un compilateur d'expressions algébriques telles que:
(A + (B * C))produisant du langage machine.
((A + (B - C))
X
(X + (Y * X))
((X / X) * (A / (B + B)))
...
expression
::=
<identifier>
| ( left_operand operator right_operand )
operator ::= + | - | * | /
left_operand ::= expression
right_operand ::= expression
Le terminal <identifier> correspond à l'ensemble des symboles Scheme.
Un environnement est une liste d'association entre des symboles et des nombres. Exemples:
((A . 12) (B . 24) (C . 36) (R2001 . 367))Dans le second environnement, A apparaît deux fois: on ne tient compte que de la première occurrence, donc A vaut 12.
((A . 12) (B . 24) (A . 36))
On implantera un évaluateur purement fonctionnel d'expressions:
eval-expression: expression, environment -> numberFichier à compléter: expressions.scm.
Return to top of page.
instruction ::= (ld <register> <identifier>)La sémantique d'une instruction dépend de son type:
| (operation target source)operation ::= add | sub | mult | div
target ::= <register>
source ::= <register>
program ::= ()
| ( instruction . program )
On implantera un évaluateur purement fonctionnel de programmes
machine:
eval-program: program, environment -> environmentExemple:
guile> (eval-program '((ld R0 A)Fichier à compléter: machine.scm.
(ld R1 B)
(add R0 R1)
(ld R1 C))
'((A . 12) (B . 24) (C . 36)))
((R1 . 36) (R0 . 36) (R1 . 24) (R0 . 12)
(A . 12) (B . 24) (C . 36))
Return to top of page.
guile> (compile '((A + B) * (C - D)))Ce compilateur (purement fonctionnel) utilise une fonction auxiliaire:
((ld R0 A) ; A
(ld R1 B) ; B
(add R0 R1) ; (A + B)
(ld R1 C) ; C
(ld R2 D) ; D
(sub R1 R2) ; (C - D)
(mult R0 R1)) ; ((A + B) * (C - D))
(compile-reg expression n):Fichier à compléter: compiler.scm.compile l'expression en n'utilisant que des registres de rang supérieur ou égal à n, et engendre un programme qui place le résultat dans le registre de rang n.
Return to top of page.
Exemple:
guile> (macroexpand '(exec ((A . 12) (B . 24) (C . 36))Fichier à compléter: exec.scm.
(ld R0 A)
(ld R1 B)
(add R0 R1)
(ld R1 C)))(begin (define A 12)
(define B 24)
(define C 36)
(define R0 ())
(define R1 ())
(ld R0 A)
(ld R1 B)
(add R0 R1)
(ld R1 C))
Return to top of page.
~gloess/scheme/project/Chaque document rendu devra indiquer en tête les noms des auteurs.
Return to top of page.
Return to top of page.
© Copyright 1999-2000 Paul Y Gloess