web-dev-qa-db-fra.com

Pourquoi utiliser l'expression postfix / préfixe au lieu d'infixer?

Je comprends comment convertir Infix en Postfix/Prefix, mais je ne comprends pas pourquoi l'expression postfix ou préfixe est utilisée dans le système informatique?

Quel est l'avantage du préfixe postfix sur l'expression de l'infixe?

3
Joydip Ghosh

Les deux pré et postfix ont essentiellement les mêmes avantages sur la notation d'infixe. Le plus important d'entre eux sont:

  • beaucoup plus facile de traduire en format adapté à une exécution directe. Soit format peut trivialement être transformé en arborescence pour un traitement ultérieur, et Postfix peut être traduit directement en code si vous utilisez un processeur à base de pile ou une machine virtuelle

  • entièrement sans ambiguïté. La notation d'infixe nécessite des règles de priorité et d'association pour le désambiguoir, ou d'ajouter des parenthèses supplémentaires qui ne sont généralement pas considérées comme faisant partie de la notation. Tant que le nombre d'arguments à chaque opérateur est connu à l'avance, la notation de préfixes et de postfix est tout à fait sans ambiguïté: "* + 5 6 3" est (5 + 6) * 3 et ne peut pas être interprété comme 5+ (6 * 3), tandis que la parenthèse est tenue de réaliser avec l'infixe.

  • prend en charge les opérateurs avec différents nombres d'arguments sans variation de la syntaxe. "Unary-op 5" et "Ternary-Op 1 2 3" Les deux fonctionnent bien, mais ont besoin de syntaxe spéciale pour les faire travailler en infixin.

10
Jules

Notez que [~ # ~ # ~] lisp [~ # ~ ~] Langues (par exemple LISP commun , schéma , Clojure et de nombreuses dialectes spécifiques inspirées par eux comme Autolisp , emacs-lisp , FOND , etc. .) Toutes utilisent une syntaxe préfixe: chaque expression commence par une parenthèse gauche, puis l'opérateur, puis les opérandes, puis la parenthèse droite. Ces expressions sont appelées S-Expressions . Par exemple, 1 + 2 * 3 est typé comme (+ 1 (* 2 3)) Et il n'y a pas besoin de préséance de l'opérateur .

Les avantages d'une telle syntaxe simple (probablement le plus simple possible pour [~ # ~ # ~] ast [~ # ~] S, à l'extérieur de la pile Langues à la FIRT) incluent:

  • règle de syntaxe facile à retenir pour les développeurs humains
  • facile et rapide à analyser les implémentations linguistiques
  • facile à émettre lors de la génération de code dans S-Expressions (de certains AST)
  • capacité à faire facilement homoiconique Langues au-dessus d'eux
  • capacité à gérer de nombreux opérandes (par ex. avoir des opérateurs ou des fonctions variadiques, ou des fonctions avec de nombreux arguments formels)
  • simple à lire, une fois que vous pouvez faire correspondre une parenthèse gauche avec sa droite

L'inconvénient de cette syntaxe est un jeu de mots sur la langue: beaucoup d'entretoises stupides insipides . Toutefois (croyez-le ou non) tout codeur LISP ne voit pas la parenthèse comme agressif et utilise la capacité (fournie par tout bon éditeur) pour correspondre à la parenthèse lors de la lecture du code à l'écran.

BTW, ce qui est important, c'est de ne pas convertir la représentation textuelle d'E.G. Infix au préfixe, mais à parse expressions dans AST (arbres de syntaxe abstraites). Très souvent, un AST est un arbre - comme une structure en mémoire, en gardant plus d'informations sur la forme syntaxique simple (par exemple, l'emplacement de la source, en tant que nom de fichier, ligne Nombre, numéro de colonne ou quelques informations de type, etc.).

2