correction exos et exemples MVaP

This commit is contained in:
Florent Madelaine 2022-11-25 18:17:28 +01:00
parent 967f7bf622
commit cc6c2f49f9
4 changed files with 209 additions and 61 deletions

View File

@ -1,61 +0,0 @@
add.mvap Un exemple simple de programme
3n+2.mvap Un exemple moins simple de programme
test.mvap Un exemple avec appel de fonction
MVaP.g4 Le parser du langage qui produit un analyseur ANTLR4
MVaPAssemblerListener.java Méthode appelée par le parcours de l'arbre d'analyse
qui produit du code binaire (CB)
MVaPAssembler.java L'assembleur qui produit du code binaire
Pile.java Un gestionnaire de pile d'entiers
CBaP.java La machine virtuelle pour le code binaire à pile
** Pour compiler l'assembleur et le machine virtuelle, il faut :
1- Avoir antlr dans son CLASSPATH :
$ export CLASSPATH=.:/usr/local/java/antlr-4.4-complete.jar
ou ajouter aux commandes : -cp .:/usr/local/java/antlr-4.4-complete.jar
2- Lancer antlr sur MVaP.g4
$ java -jar /usr/local/java/antlr-4.4-complete.jar MVaP.g4
3- Compiler l'assembleur et la machine virtuelle (il suffit de demander la
compilation des fichiers contenant les main, javac compilera les autres
classes automatiquement...)
$ javac MVaPAssembler.java CBaP.java
** Pour exécuter du code mvap, il faut :
1- Assembler :
$ java MVaPAssembler add.mvap
ou avec des traces :
$ java MVaPAssembler -d add.mvap
ce qui produit le fichier add.mvap.cbap
2- Exécuter :
$ java CBaP add.mvap.cbap
ou pour mieux comprendre avec des traces :
$ java CBaP -d add.mvap.cbap
** Pour construire le jar, il faut :
1- avoir un META-INF/MANIFEST pour inclure le jar antlr dans le CLASSPATH :
Manifest-Version: 1.0
Version: 2.1
Main-Class: CBaP
Class-Path: /usr/local/java/antlr-4.4-complete.jar
2- Contruire le jar avec :
$ jar cfm MVaP.jar META-INF/MANIFEST *.class
On peut aussi faire tout simplement :
$ make
** Utilisation du jar :
1- Assembler :
$ java -cp .:/usr/local/java/antlr-4.4-complete.jar:MVaP.jar MVaPAssembler add.mvap
2- Exécuter :
$ java -jar MVaP.jar -d add.mvap.cbap

View File

@ -11,3 +11,61 @@
#
#
# On souhaite afficher 1 ou 2 selon que le parcours 1 ou parcours 2 est le plus court en temps.
#
# calcul du parcours 1
# PUSHI 30
# PUSHI 45
# PUSHI 20
# ADD
# ADD
# calcul du parcours 2
# PUSHI 55
# PUSHI 16
# PUSHI 20
# ADD
# ADD
# Comparons les deux durées
# INF
# 0 veut dire non, différent de 0 veut dire oui
# HALT
### On a fait le test (30+45+20 < 55+16+20)?
### On veut vraiment faire
### if (30+45+20 < 55+16+20):
### write 1
### else :
### write 2
# calcul du parcours 1
PUSHI 30
PUSHI 45
PUSHI 20
ADD
ADD
# calcul du parcours 2
PUSHI 55
PUSHI 16
PUSHI 20
ADD
ADD
# Comparons les deux durées
INF
# 0 veut dire non, différent de 0 veut dire oui
JUMPF 0
#
# then
PUSHI 1
WRITE
POP
#
JUMP 1
LABEL 0
#
# else
PUSHI 2
WRITE
POP
#
LABEL 1
# la suite
HALT

77
MVaP/ExoVoyager2.mvap Normal file
View File

@ -0,0 +1,77 @@
### On souhaite comparer 2 parcours en transport public entre l'université de Créteil et l'IUT de SF.
# Parcours 1 :
# prendre la ligne 1 puis 8 pour Gare de Lyon (30 minutes)
# prendre la ligne R pour Fontainebleau-Avon (45 minutes)
# prendre un vélo pour l'IUT (20 minutes).
# vs
# Parcours 2 :
# marcher au Vert de Maison prendre la ligne D pour Melun (55 minutes)
# changer à Melun prendre la ligne R pour Fontainebleau-Avon (16 minutes)
# prendre un vélo pour l'IUT (20 minutes).
#
#
# On souhaite afficher 1 ou 2 selon que le parcours 1 ou parcours 2 est le plus court en temps.
# Puis on souhaite afficher la durée du parcours optimal
#
# A compléter
#
# réserve de la place pour la durée du parcours 1
PUSHI 0
# réserve de la place pour la durée du parcours 2
PUSHI 0
# dp1 habite à l'adresse 0
# dp2 habite à l'addresse 1
#
#
# calcul du parcours 1
PUSHI 30
PUSHI 45
PUSHI 20
ADD
ADD
# dupliquer le résultat pour le stocker dans dp1
DUP
STOREG 0
# calcul du parcours 2
PUSHI 55
PUSHI 16
PUSHI 20
ADD
ADD
# dupliquer le résultat pour le stocker dans dp2
DUP
STOREG 1
# Comparons les deux durées
INF
# 0 veut dire non, différent de 0 veut dire oui
JUMPF 0
#
# then
PUSHI 1
WRITE
POP
# charge la valeur de dp1 en haut de la pile
PUSHG 0
WRITE
POP
#
JUMP 1
LABEL 0
#
# else
PUSHI 2
WRITE
POP
# charge la valeur de dp2 en haut de la pile
PUSHG 1
WRITE
POP
#
LABEL 1
# la suite
#
# vide la mémoire des variables globales dp1 et dp2
POP
POP
HALT

74
MVaP/ExoVoyager3.mvap Normal file
View File

@ -0,0 +1,74 @@
### On souhaite comparer 2 parcours en transport public avec au plus deux changements
### L'utilisateur doit nous donner ces 6 durées.
# Parcours 1 :
# 3 durées
# vs
# Parcours 2 :
# 3 durées
#
#
# On souhaite afficher 1 ou 2 selon que le parcours 1 ou parcours 2 est le plus court en temps.
# Puis on souhaite afficher la durée du parcours optimal
#
# A compléter
#
# réserve de la place pour la durée du parcours 1
PUSHI 0
# réserve de la place pour la durée du parcours 2
PUSHI 0
# dp1 habite à l'adresse 0
# dp2 habite à l'addresse 1
#
#
# calcul du parcours 1
READ
READ
READ
ADD
ADD
# dupliquer le résultat pour le stocker dans dp1
DUP
STOREG 0
# calcul du parcours 2
READ
READ
READ
ADD
ADD
# dupliquer le résultat pour le stocker dans dp2
DUP
STOREG 1
# Comparons les deux durées
INF
# 0 veut dire non, différent de 0 veut dire oui
JUMPF 0
#
# then
PUSHI 1
WRITE
POP
# charge la valeur de dp1 en haut de la pile
PUSHG 0
WRITE
POP
#
JUMP 1
LABEL 0
#
# else
PUSHI 2
WRITE
POP
# charge la valeur de dp2 en haut de la pile
PUSHG 1
WRITE
POP
#
LABEL 1
# la suite
#
# vide la mémoire des variables globales dp1 et dp2
POP
POP
HALT