2016-07-22 2 views
1

Je suis en train de faire un simple interpréteur bytecode qui utilise RPN pour la notation d'expression et la notation vraiment postfix pour quoi que ce soit, mais maintenant je suis à la question: est-ce que l'évaluation de court-circuit peut être utilisé sur les expressions postfixes? Par exemple lors de l'évaluation de l'expression (false & & (factorial (7)> ​​factorial (5))) C++ connaît le résultat de l'opérateur & & sur les deux opérandes évalue à false avant même d'arriver au second opérande, puisque (false & & quoi que ce soit) est toujours égal à false. Maintenant, quand vous mettez cela dans RPN, vous obtenez (false (7 factorielle 5 factorielle>) & &). Je voulais construire un analyseur d'expression RPN efficace, donc le problème est le suivant: comment faire un analyseur d'expression RPN efficace avec une évaluation de court-circuit?RPN évaluation de court-circuit

+0

vous écrivez du code. Nous ne sommes pas ici pour concevoir votre système pour vous, ou vous apprendre à le concevoir. –

+0

@MarcB Merci pour l'information que je suppose. Quoi qu'il en soit, j'ai eu une réponse utile, alors oui. –

+0

La notation RPN et postfix est la même chose, pas deux choses différentes. Vous ne construisez pas d'analyseurs RPN en interprètes. L'entrée est déjà analysée et peut être traitée linéairement. Si vous voulez une évaluation de court-circuit, vous devez introduire des branches. – EJP

Répondre

1

Vous évalueriez une expression RPN en deux phases. Phase 1: analyser le RPN et construire une représentation arborescente du RPN. Ainsi, dans cet arbre, par exemple, le nœud && a deux nœuds enfants, pour chaque moitié de l'expression. La construction de cet arbre est un processus presque identique à l'évaluation du RPN, à l'exception de la partie évaluation, qui est remplacée par l'opération de construction d'un nouveau nœud, et de lier ses nœuds fils à leur nouveau nœud parent, puis repoussant le nœud parent sur RPN pile d'évaluation. Phase 2: évaluer l'arbre construit, en utilisant la descente récursive. À ce stade, l'évaluation de court-circuit devient triviale: évaluez l'enfant de gauche d'un &&, puis décidez si vous voulez réellement évaluer l'enfant de droite.

Même chose pour le nœud ||, etc ...

+0

Merci c'est parfait! :) –

+0

Question: cela serait-il différent si je passais plutôt à utiliser PN au lieu de RPN? –

+0

La première phase serait différente, bien sûr. Logique différente pour construire l'arbre. Alternativement, l'analyseur PN peut être écrit de telle sorte qu'il porte un drapeau "ignorer", où il ne fait qu'analyser et avaler l'entrée, sans l'évaluer, en passant de façon récursive le drapeau; avec les opérateurs '&&' et '||' définissant l'indicateur pour l'évaluation de droite, si l'évaluation de gauche rendait inutile l'évaluation du côté droit. –