3

J'ai écrit un compilateur de base qui génère un AST, en prenant correctement en compte la priorité de l'opérateur dans les expressions. Cependant, lors de la génération de code pour produire du code C++, je ne suis pas sûr de la façon de gérer l'utilisation des crochets.Associativité et précédence des expressions lors de la génération de code C/C++?

Pour cette expression:

A - (B - c) 

L'AST ci-dessous:

- 
/\ 
A - 
    /\ 
    B C 

Si générer correctement l'expression précédente, y compris les parenthèses, si le deuxième opérateur est un opérateur d'addition (par exemple), les parenthèses seraient inutiles. Je préférerais ne les utiliser que lorsque cela est nécessaire pour améliorer la lisibilité.

Existe-t-il des règles dictant ce type de comportement et comment savoir quand utiliser des parenthèses. Plus et moins ont le même niveau de priorité dans la plupart des langues et j'aimerais que cela fonctionne pour tous les opérateurs.

+0

Quel type de code générez-vous? Si vous générez du code machine (comme le supposeraient la plupart des gens dans ce contexte), alors votre question est un peu absurde. * Générez-vous un langage de niveau (er) élevé comme C? * – BCS

+0

Excuses, je devinais que générer un langage de niveau supérieur serait plus commun ou du moins que l'utilisation du terme code plutôt que de l'assemblage le rendrait clair. J'ai mis à jour la question pour refléter cela ... – Dan

Répondre

4

Historiquement, ils appellent cela "jolie impression". Si vous utilisez Google avec "priorité", vous pouvez trouver quelques exemples pour vous aider.

Informellement, je pense que l'idée de base est que lorsque vous vous recourbez dans une sous-expression, vous comparez sa priorité à l'expression courante. Si c'est plus bas, vous avez besoin de parenthèses. Sinon, vous ne le faites pas. L'associativité peut être gérée en effectuant une vérification similaire: si la sous-expression a la même priorité en tant que parent, vous avez besoin de parenthèses si c'est du mauvais côté en fonction de l'associativité.

+1

cela a été très utile, merci. – Dan

+1

Une autre façon de regarder le bit d'associativité serait de comparer les côtés gauche et droit avec différentes préséances, généralement un pas plus haut en regardant à droite qu'en regardant à gauche. Pour que cela fonctionne correctement, vous devrez peut-être avoir des lacunes dans les niveaux attribués aux nœuds. – BCS

+0

Vous pouvez trouver cette réponse sur prettyprinting généralement utile: http://stackoverflow.com/a/5834775/120163 –

2

Si une opération de priorité supérieure est inférieure dans l'arborescence, vous n'avez pas besoin de la mettre entre parenthèses.

Cependant, il ne suffit pas de connaître la priorité des opérations. Vous devez également connaître le associativity des opérations. Cela permet de grouper correctement les opérations de préséance égale. Dites, la soustraction est laissée associative, donc A-B-C est égal à (A-B)-C, mais pas à A-(B-C). Notez simplement toute la table des préséances et des associativités pour toutes vos opérations et consultez-la lorsque vous générez votre expression.

Questions connexes