Bonjour,
Je dois réaliser un compilateur Fortran vers Assembleur MIPS à l'aide des outils lex/yacc
J'ai pour l'instant avancé sans grande difficulté mais il me reste à présent à traiter la traduction des structures de controle (if, while, etc)....
Sur le net j'ai pu trouver une doc anglaise expliquant plus ou moins la meme chose que ce que j'avais vu en cours à savoir :
Avec .true/.false correspond à tous les quad d'etiquette true/false qui devront etre complétés le moment venu avec la valeur de l'etiquette du quad à executer...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 E -> E(1) AND E(2) { complete(E(1).true, M.quad); E.false = concat(E(1).fale, E(2).false); E.true = E(2).true; } | E(1) OR E(2) { ..... } | not E(1) { E.true = E(1).false; E.false = E(1).true; } | id(1) oprel id(2) { E.true = crelist(nextquad); E.false = crelist(nextquad+1); GENCODE(if id(1).ptr oprel id(2).ptr goto ?); GENCODE(goto ?); } | ....... S-> if E then M S(1) { complete(E.true, M.quad); S.next = concat(E.false, S(1).next); } M -> /* vide */ { M.quad = nextquad; }
.next attribut de type liste de quad
nextquad : contient la valeur de l'etiquette du prochain quad a generer...
crelist(i) : cree la liste contenant l'etiquette i
concat(p1, p2) : concatene les 2 listes p1 et p2
complete(p, i) : complete tous les quad de la liste p avec l'etiquette i
Ex d'utilisation :
P<Q or R<S and T<U
100: if P<Q goto T
101: goto 102
102: if R<S goto 104
103: goto F
104: if T<U goto T
105: goto F
--> En gras ce sont les codes completes ulterieurement
--> En bleu ceux qui ne sont pas completes
Mon probleme est que je n'ai aucune idee de comment completer au fur et a mesure le code genere....
Est ce que quelqu'un aurait une piste à me donner car cela fait un petit moment que je cherche sans vraiment trouver de resultat concluant.....
Merci pour vos reponses
Partager