Énoncé¶
Nous vous proposons de réaliser un interpréteur de RPL simplifié.
Un programme écrit dans ce langage est une suite d'instructions séparées par une ou plusieurs espaces. Ces instructions manipulent une pile de nombres entiers, qui au départ est vide. Les opérations sont toutes postfixes. Par exemple, "1 2" représente la pile où 2 est le premier élément et 1 le deuxième ; dans "1 2 +", on empile 1, on empile 2, puis on dépile les deux premiers éléments de la pile pour évaluer le +.
Liste des instructions¶
- Nombres (ces instructions empilent le nombre entier correspondant)
- Nombre binaire : suite de 0-1 suivie du suffixe 'b' ou 'B'. ex : "101010b"
- Nombre décimal : suite de 0-9. ex : "42"
- Nombre hexa : suite de 0-9,A-F suivie du suffixe 'h' ou 'H'. ex : "2Ah"
-
Nombre octal : suite de 0-7 suivie du suffixe 'o' ou 'O'. ex : "66o"
-
Instructions de manipulation de la pile :
- "DROP" : Supprime le premier niveau de la pile.
- "DUP" : Duplique le premier niveau de la pile.
-
"SWAP" : Echange les deux premiers niveaux de la pile.
-
Instructions de calcul :
-
"+", "-", "*", "/" : dépilent les deux premiers éléments, effectuent le calcul correspondant, puis empilent le résultat. Par exemple, "3 12 2 /" retourne "3 6".
-
Instructions de comparaison :
-
"<", "<=", ">", ">=", "=", "<>" : comparent les deux premiers éléments de la pile en utilisant l'opérateur, et les remplacent par 1 si la comparaison est vraie, 0 sinon. ex: "42 24 #" retourne 1.
-
Instructions de gestion des variables :
- Une variable est une suite de lettres parmi a-z A-Z qui ne correspond ni à l'écriture d'un nombre ni à une instruction. ("ah" n'est pas un nom de variable, c'est un nombre hexadécimal). Pour les instructions suivantes, on prend comme exemple "variable" comme nom de variable.
- "-> variable" : Dépile le premier élément, et l'associe à la variable.
- "variable" : Empile la valeur associée à la variable correspondante.
-
ex. "42 -> variable variable" retourne 42.
-
Instructions de contrôle :
- "if (1) then (2) else (3) end" (1), (2) et (3) représentent une ou plusieurs instructions.
- Le groupe (1), potentiellement vide, est executé. Ensuite, le premier élément de la pile est dépilé. S'il est different de 0, le groupe (2) est executé. Sinon, c'est le groupe (3) qui est executé.
- ex. "0 -> c if c then 1 else 0 end" (ou de manière équivalente "0 if then 1 else 0") retourne 0.
- "for variable (1) next"
- Dépile les deux premiers éléments de la pile. La variable variable prendra successivement pour valeur tous les entiers compris entre le deuxième élément dépilé et le premier élément dépilé inclus. A chaque itération, le groupe d'instructions (1) est exécuté.
- ex. "0 -> c 1 10 for i c 1 + -> c next c" retourne 10.
Entrée¶
L'entrée contient deux lignes :
- Le nombre de caractères de la chaîne contenant le programme RPL.
- Le programme RPL à exécuter.
Sortie¶
La sortie contient une ligne :
- La valeur renvoyée par le programme.