2012-06-19 3 views
1

Je travaille sur un interrupteur qui permet de définir ses propres opérateurs. Le but est alors de prendre un AST qui ressemble à exp op exp op exp et de le transformer en exp op (exp op exp) ou (exp op exp) op exp en fonction de la préséance relative et de l'associativité des deux opérateurs. Le langage est dynamique, la seule façon de savoir quelle version de l'opérateur utiliser est d'évaluer la première expression et de lui demander quelle version de op utiliser.Y a-t-il des opérateurs de court-circuit associatifs

D'autre part, il est important que nous évaluons pas la deuxième expression parce que si op est || (comme couramment utilisé) alors nous devrions être en mesure de court-circuit si le premier est expfalse.

Un problème se poserait si un opérateur était à la fois associatif et court-circuitant. Ma question est de savoir s'il existe des opérateurs de court-circuit associatifs à usage courant (pour une valeur choisie de "commun")?

N.b. L'affectation est gérée séparément par l'analyseur. Par conséquent, = n'est pas un opérateur et a (op)= b est un sucre syntaxique pour a = a op b.

+0

En fait, l'association correcte fait beaucoup plus de sens. Essayez de visualiser l'arbre d'analyse de 'a ou b ou c ou d ou e'. Quand l'associatif de gauche et 'a' est vrai, nous montons et remontons l'arbre pour devenir vrai au sommet. Quand le droit-associatif, si 'a' est vrai, ta-da, nous avons fini! Tellement plus facile d'ignorer tout le reste de l'expression. Pourquoi dites-vous qu'il y a un problème avec l'associativité à droite? Ils ont tous les deux le même comportement à mon humble avis. –

Répondre

1

Boolean implication peut être.

je ne serais probablement lu

a → b → c 

comme « implique que b implique c » qui suggère qu'il devrait parenthésée

a → (b → c) 

et booléenne implication devrait probablement être court-circuit depuis quand un est faux alors le côté droit de (a → b) n'est pas pertinent pour le résultat.

+0

Intéressant! Alors qu'il s'associe à la droite, il court-circuit vers le ** left **, c'est-à-dire que a sera toujours évalué, mais 'b' est groupé avec' c' et non 'a'. Je pourrais encore légitimement évaluer 'a' pour trouver la signification de' → '. –

+0

@ JohnF.Miller, d'autres opérateurs associatifs droits évaluent généralement de gauche à droite dans les langues où ces choses sont bien définies. L'assignation est habituellement associative, mais en JavaScript, le lhs est évalué avant le rhs: 'var x = 42; var y = []; (x = y) [0] = x; 'se termine dans le même état que le programme' var y = []; x = y [0] = y; ' Je crois que Java fait de même. Python interdit l'affectation en tant que sous-expression; et C, C++ et OCaml ne spécifient pas d'ordre d'évaluation. –

Questions connexes