Surveillez de près le rapport des points assignés au générateur et aux extensions bonus: ne gaspillez pas des forces ou du temps dont vous ne disposez pas pour un gain qui n'en vaut pas forcément la peine.

Si vous souhaitez modifier les grammaires ou le système de types de Vier dans le cadre de l'implantation d'une extension, vous pouvez vous servir du fichier LaTeX original de la spécification (qui utilises la librairie mathpartir).

Extension 1: la boucle

Actuellement Vier ne permet d'implanter du code répétitif qu'à l'aide de la récursion. La boucle while — qui répète une expression jusqu'à ce qu'une condition soit vraie — est la construction la plus simple permettant d'ajouter la répétition de façon native.

Le bonus de 2 points sera donné à tout groupe qui, lors du test de l'étape generator, peut démontrer les propriétés suivantes de son compilateur.

Extension 2: le test et la coercition dynamique de type

Certains langages objet, comme Java ou Scala, disposent d'un mécanisme permettant

Ce mécanisme, très utilisé dans des langages avec des systèmes de types «pauvres» (comme Java 1.4), peut également être ajouté à Vier.

Le bonus de 4 points sera donné à tout groupe qui, lors du test de l'étape generator, peut démontrer les propriétés suivantes de son compilateur.

Extension 3: les variables locales

La seule forme de stockage modifiable que Vier permet sont les champs des classes. Dans ces conditions, l'implantation des méthodes tend à s'étendre dans l'interface de la classe, ce qui est regrettable. La notion de variable locale permet de différencier entre du stockage propre à la classe, et du stockage temporaire pour l'implantation d'une méthode.

En Vier, l'endroit naturel ou définir des variables est sous forme d'expression à l'intérieur des blocs. La variable est ensuite accessible jusqu'à la fin du bloc (ou dans des blocs imbriqués).

Conseils: Pour gérer les variables dans le générateur, il faut modifier la gestion de la pile. L'adresse du début du bloc d'activation d'une méthode ne change pas au cours d'un appel donné; il est désigné par FP (frame pointer). La fin du bloc est par contre variable (contrairement à la situation sans variable); elle est repérée par le registre SP (stack pointer). La différence entre SP et FP est appelée la taille du bloc d'activation (frame size).

Ainsi, lors de la génération de code, vous devez calculer pour chaque instruction quelle est la taille du bloc d'activation. Pour cela, la classe Code fournit les méthodes incFrameSize, decFrameSize et getFrameSize.

La déclaration d'une variable la place au sommet de la pile. Afin de générer le code pour modifier et lire cette variable, il faut toujours savoir où elle se trouve sur la pile. Pour cela, on ajoute un champ offset au symbole de variable. Ce champ contient la position de la variable sur la pile par rapport à FP. Il doit être initialisé pendant la génération du code de la déclaration de variable.

La génération de code des blocs doit bien sûr générer le code des expressions et de l'expression finale qu'ils contiennent. En plus de cela, ils doivent libérer la mémoire allouée sur la pile par les éventuelles déclarations de variables qu'ils contiennent.

Le bonus de 6 points sera donné à tout groupe qui, lors du test de l'étape generator, peut démontrer les propriétés suivantes de son compilateur.