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)".
- Écrire une fonction1IndiceDiviser la chaîne par des espaces et mapper chaque élément vers un type de jeton selon sa valeur.
expr_to_list : string -> token listqui renvoie la liste de lexèmes (token) correspondant à une expression arithmétique séparée par des espaces. Par exempleexpr_to_list "5 2 3 + x"renvoie[TKNum 5; TKNum 2; TKNum 3; TKOp "+"; TKOp "x"]. - Écrire une fonction2IndiceParcourir la liste de jetons en maintenant une pile et appliquer les opérateurs sur les deux éléments du haut.
compute : token list -> intqui calcule la valeur d'une expression arithmétique en notation polonaise inverse à l'aide d'une pile. Par exemplecompute [TKNum 5; TKNum 2; TKNum 3; TKOp "+"; TKOp "x"]renvoie25. - Tester les fonctions précédentes sur l'expression3IndiceEnchaîner la fonction de parsing avec la fonction de calcul et vérifier le résultat produit.
5 2 3 + xet vérifier que le calcul produit bien le résultat attendu. - Écrire une fonction4IndiceUtiliser une pile pour accumuler les sous-arbres et combiner les deux nœuds supérieurs lors de la lecture d'un opérateur.
build_atree_from_rpn : token list -> atreequi renvoie l'arbre syntaxique abstrait correspondant à une expression en notation polonaise inverse. Par exemplebuild_atree_from_rpn [TKNum 5; TKNum 2; TKNum 3; TKOp "+"; TKOp "x"]renvoieNode("x", Num 5, Node("+", Num 2, Num 3)). - Écrire une fonction5IndiceAssocier un entier à chaque opérateur en utilisant un motif de correspondance sur le nœud de l'arbre.
priority : atree -> intqui calcule la priorité d'un nœud opérateur (1 pour + et -, 2 pour x et /, 0 sinon). Par exemplepriority (Node("+", Num 1, Num 2))renvoie1. - Écrire une fonction6IndiceParcourir récursivement l'arbre syntaxique et ajouter des parenthèses autour des enfants dont la priorité est inférieure.
rpn_to_infix : token list -> token listqui renvoie la liste des lexèmes d'une expression en notation infixe, en ajoutant les parenthèses nécessaires selon les priorités. Par exemplerpn_to_infix [TKNum 5; TKNum 2; TKNum 3; TKOp "+"; TKOp "x"]renvoie[TKNum 5; TKOp "x"; TKOp "("; TKNum 2; TKOp "+"; TKNum 3; TKOp ")"]. - Écrire une fonction7IndiceParcourir la liste de jetons et accumuler leurs représentations textuelles dans une chaîne initiale vide.
concat : token list -> stringqui renvoie la chaîne de caractères correspondant à une liste de jetons. Par exempleconcat [TKNum 5; TKOp "x"; TKOp "("; TKNum 2; TKOp "+"; TKNum 3; TKOp ")"]renvoie"5x(2+3)". - Enchaîner les fonctions8IndiceComposer les fonctions de transformation successivement sur la chaîne d'entrée pour obtenir la chaîne infixe finale.
expr_to_list,rpn_to_infixetconcatsur l'expression5 2 3 + xpour obtenir la chaîne infixe finale.
Langage
Console initialisée. En attente de l'interpréteur...