Interpréteur d’expressions arithmétiques (unaire → décimal)
4 rubans
20 états
Cette machine prend en entrée une expression arithmétique avec les nombres en unaire, c’est à dire générée par la grammaire suivante:
e,f ::= nb | (e + f) | (e * f)
Où nb
est la représentation unaire d’un nombre: le nombre n est représentée par une séquence de 1
de longueur n.
Par exemple, l’expression 2 × 3 s’écrit (11 * 111)
. Notez que 0 (zéro) s’écrit comme une chaîne vide, puisqu’il s’agit d’une séquence de 1
de longueur 0. On écrit donc 0 + (2 × 0) comme ceci : ( + ( 11 * ) )
.
La machine calcule le résultat de l’expression donnée en entrée, et le convertit en décimal.
Pour cela, la machine procède comme suit.
- Tout d’abord, elle transforme son entrée, pour la mettre en notation polonaise (états
parser
etparser.retour
) sur le ruban4
. - Ensuite, la machine effectue le calcul, en maintenant sur le ruban
3
une pile d’arguments. À chaque opération, on dépile les deux premiers arguments, on calcule le résultat (en utilisant les rubans1
et2
si besoin pour le calcul). Le résultat est devient l’argument sur le sommet de la pile. - Enfin, on convertit le résultat en décimal. Pour cela, on écrit
0
sur le premier ruban, puis :- on efface le premier
1
du ruban3
; - on incrémente le nombre écrit sur le premier ruban;
- on tente de répéter l’opération.
- on efface le premier
- Lorsequ’on voit un
0
sur le ruban3
, on a notre résultat!
Simulateur
Spécification de la machine
Messages de sortie du compilateur
https://machines.brunet-zamansky.fr