2017-03-23 5 views
1

En classe de langage de programmation, j'ai appris la précédence et l'associativité des opérateurs. La sous est simple -contexte-grammairePriorité de l'opérateur dans le langage de programmation

<expr> -> <expr> + <term> | <term> 
<term> -> <term> * <fact> | <fact> 
<fact> -> (<expr>) | a 

En utilisant Grammaire de-contexte ci-dessus, nous pouvons faire la phrase

a+a+(a+a) 

je pense, l'ordre doit être fait opération suivre: (a + a) -> a + a puis plus tout à fait. Cependant, lors d'une conférence, le professeur a dit que les deux (a + a) -> a + a et a + a -> (a + a) sont corrects. Les étudiants sont en panique. Même dans la phrase ci-dessous,

(a+a)+((a+a)) 

fois l'ordre ((a + a)) -> (a + a) puis plus et (a + a) -> ((a + a)) est correct. Il vient de dire, après avoir fait l'arbre d'analyse, puis converti en langage assembleur donc l'ordre dépend du compilateur.

Je ne comprends pas son explication. Est-ce que quelqu'un peut expliquer pourquoi il y a deux ordres possibles ??

+1

Notez que la grammaire donnée est ambiguë. ' + ' devrait probablement être ' * '. –

+0

@MichaelDyck correct. Ma faute de frappe –

Répondre

1

L'ordre d'évaluation est indépendant du regroupement. Si vous devez calculer X + Y (où X et Y sont des sous-expressions), peu importe que vous calculiez d'abord temp2 = Y puis temp1 = X ou inversement. À la fin temp1 + temp2 a la même valeur. Parfois, il est plus pratique de calculer l'argument de droite en premier. (Peut-être que vous le connaissez déjà à partir d'un calcul précédent, par exemple.)

Si le calcul de X ou Y a un effet secondaire, cela peut devoir être pris en compte. Certaines langues insistent sur le fait que les effets secondaires se produisent de gauche à droite; d'autres permettent n'importe quel ordre. Mais en aucun cas le regroupement des parenthèses n'affecte le ordre du calcul. Il détermine seulement ce qui est calculé.