2011-12-21 4 views
0

J'ai réussi à obtenir le lexeur, le vérificateur de syntaxe et la sémantique et maintenant je veux passer à la génération de code intermédiaire. Le problème est que je ne sais pas comment gérer les expressions logiques. J'ai lu quelque chose sur E.true et E.false. Cet exemple est partout mais je ne l'ai pas compris.Les expressions logiques et la génération de code intermédiaire

Par exemple, si je le code suivant

if x>y and x<y or x == 1 then 
    //super duper code here 
    x = x+1  
else 
    //super duper wow code here 
    y = y+1 
endif 

Le résultat doit être quelque chose comme ça

1: > x y 3 
2: jmp _ _ 9 
3: < x y 7 
4: jmp _ _ 5 
5: == x 1 _ 
6: jmp _ _ 9 
7: + 1 x $1 
8: = $1 _ x 
9: + 1 y $2 
10: = $2 _ y 

mais les étiquettes pour les sauts ne sont pas connus jusqu'à ce que vous avez terminé en fait l'analyse de l'instruction if . Donc, je dois générer des quads, puis les backpatch. Comment puis-je le faire avec la grammaire de cette post? Est-ce que quelqu'un peut expliquer comment ça va aller parce que je suis vraiment confus.

+1

Est-ce que l'étiquette de devoirs devrait aussi être ajoutée à cette question? – AusCBloke

+0

@AusCBloke corrigé – Takatakas

Répondre

1

Oui, vous devez générer des cibles de branche qui sont des symboles/étiquettes. Si votre langage intermédiaire (IL) le permet, vous ne devriez probablement pas du tout utiliser d'emplacements d'instructions numériques. (L'emplacement de l'instruction intermédiaire numérique n'aide pas la génération du code final ... car ils ne correspondent pas simplement aux adresses/décalages pour les instructions finales.)

L'autre indice est que de nombreuses constructions impliquent une exécution séquentielle. comprend la plupart des types d'expression simple. Donc, cela simplifierait les choses si l'IL soutenait cela; c'est-à-dire qu'aucune étiquette cible ne passe à l'instruction suivante. Cela simplifiera la génération de code des séquences IL.

+0

Pouvez-vous donner un exemple avec le code que j'ai dans mon post? – Takatakas

+0

@Takatakas - non, je ne pouvais pas. C'est votre devoir, pas le mien. –

+0

Comme c'est gentil de votre part. Vous avez été très utile. Je ne vous ai pas demandé d'écrire le code pour moi. Je l'ai compris moi-même. – Takatakas

Questions connexes