ioCode

Calculer en notation polonaise inverse

Piles • Exercices 1A

Les objectifs de cet exercice sont de :

  • calculer une expression arithmétique en notation polonaise inverse (RPN), c'est-à-dire de type "5 3 2 + *",
  • transformer une expression arithmétique RPN en expression infixe, c'est-à-dire "5 * (3 + 2)".
  1. Écrire une fonction expr_to_list : string -> token list qui renvoie la liste de lexèmes (token) correspondant à une expression arithmétique séparée par des espaces. Par exemple expr_to_list "5 2 3 + x" renvoie [TKNum 5; TKNum 2; TKNum 3; TKOp "+"; TKOp "x"].
  2. Écrire une fonction compute : token list -> int qui calcule la valeur d'une expression arithmétique en notation polonaise inverse à l'aide d'une pile. Par exemple compute [TKNum 5; TKNum 2; TKNum 3; TKOp "+"; TKOp "x"] renvoie 25.
  3. Tester les fonctions précédentes sur l'expression 5 2 3 + x et vérifier que le calcul produit bien le résultat attendu.
  4. Écrire une fonction build_atree_from_rpn : token list -> atree qui renvoie l'arbre syntaxique abstrait correspondant à une expression en notation polonaise inverse. Par exemple build_atree_from_rpn [TKNum 5; TKNum 2; TKNum 3; TKOp "+"; TKOp "x"] renvoie Node("x", Num 5, Node("+", Num 2, Num 3)).
  5. Écrire une fonction priority : atree -> int qui calcule la priorité d'un nœud opérateur (1 pour + et -, 2 pour x et /, 0 sinon). Par exemple priority (Node("+", Num 1, Num 2)) renvoie 1.
  6. Écrire une fonction rpn_to_infix : token list -> token list qui renvoie la liste des lexèmes d'une expression en notation infixe, en ajoutant les parenthèses nécessaires selon les priorités. Par exemple rpn_to_infix [TKNum 5; TKNum 2; TKNum 3; TKOp "+"; TKOp "x"] renvoie [TKNum 5; TKOp "x"; TKOp "("; TKNum 2; TKOp "+"; TKNum 3; TKOp ")"].
  7. Écrire une fonction concat : token list -> string qui renvoie la chaîne de caractères correspondant à une liste de jetons. Par exemple concat [TKNum 5; TKOp "x"; TKOp "("; TKNum 2; TKOp "+"; TKNum 3; TKOp ")"] renvoie "5x(2+3)".
  8. Enchaîner les fonctions expr_to_list, rpn_to_infix et concat sur l'expression 5 2 3 + x pour obtenir la chaîne infixe finale.
Langage
Console initialisée. En attente de l'interpréteur...