LFA IFR - Compilatoare - Cap 7 (comentat pe scurt) La finalul acestei pagini sunt indicatii cum sa predati proiectul.
Deschideti manualul de Compilatoare la pg 63.
De fapt aici este munca adevarat a compilatorului la crearea de cod.
Dati pg [la pg 64, a doua pagina din Cap 7].
Veti gasi acolo cum arat codul fiecarei instructiuni, inclusiv declaratia:
Lista lor:
-Traducerea declaratiilor:
Obs: Cele n variabile ale programului Simple vor ocupa primele locuri din stiva stack, (vezi desenul cu imaginea procesorului), pagina despre ASC _invatam un procesor.
se compileaza in
integer x,y,z. -----------------------> DATA 2 (numerotarea incepe de la zero)
-Traducerea instructiunilor
-- Atribuirea [vezi cam la pg 64]
-- If-ul
-- While-ul
-- Read-ul
-- Write-ul
Traducerea expresiilor
-- Urmareste ideea de la povestea cu transcrierea expresiei in forma poloneza postfixata, va amintiti din anul I ?
(2+3)*5 devenea
2 3 + 5 *
La compilare va deveni:
LD_INT 2 ; pun 2 in stiva
LD_INT 3 ; pun 3 in stiva
ADD ; scot 2,3 pun suma 5 in loc
LD_INT 5 ; mai pun un 5 deasupra
MULT ; scot 5,5 si pun 5*5 = 25 in loc.
Ati prins poanta ? E o asemanare aici !
Nu v-ati prins ? Desenati stiva si desenati cum executa masina virtuala operatiile in stiva.
Practica: Modulul generator de cod.
Copiati dosarul Lab6 in dosarul Lab7. Adaugati modulul CG.h si faceti modificari la celelalte fisiere.
In capitolul 7 aveti un paragraf "Modulul generator de cod:CG.h", in care sunt scrise op primitive ale generatorului de cod. Nu e tot generatorul aici !
Editati fisierul si puneti-l in dosarul Lab7 !
Urmeaza paragraful: Modificari ale modulului: Tabela de Simboluri: ST.h
Fiindca variabilele compilatorului au nevoie de adrese, se adauga acel offset in structura symrec.
De asemenea, functia putsym de adugare a simbolurilor in tabela de simboluri va adauga o variabila dar va memora despre ea si acel offset, pozitia ei in zona de variabile.
Modificati putsym ca la pg 68, inainte de a face ....
Modificarile parserului: Simple.y
Mare atentie la explicatiile urmatoare din manual !
Adaugati in Simple.y toate elementele indicate:
1)struct lbs {
....
}
Sa aiba ce ii trebuie !
2)Functia newlblrec(). Aloca spatii pt etichete.
3) Functia context_check() se modifica, apare o ramura else care genereaza cod odata cu verificarea numelui variabilei in tabela de simboluri. De fapt context_check() devine astfel o parte a generatorului de cod care cand compileaza o variabila, verifica daca ea e declarat in tabela de simboluri. Observati ca ea mai primeste un parametru nou, acel code_ops , codul masina al instructiunii referitoare la variabila, al instructiunii care foloseste variabila.
4) In zona %token se adauga <intval> <lbls> pe linga <id>. Sunt informatii semantice asociate numarului, (e valoarea), unei instructiuni cu salturi (If,WHILE etc, sunt doua etichete vezi L1: L2:).
Urmeaza sa modificam ceea ce urmeaza dupa
/* Declaratii pentru C si Parser */
dupa
%% !
Aici este cu adevarat miezul generatorului de cod, care face exact ce este explicat la inceputul capitolului.
Stop: Respirati adanc, vine partea grea de studiat. Studiati cu creionul in mana acoladele { } din dreptul regulilor gramaticale. Acolo se genereaza codul.
Sfat: Un struct lbs obtinut cu functia newlblrec() contine doi pointeri sau doua valori numerice, pointerii fiind folositi pentru a indca fie locul backpatching-ului, fie a fi adrese de destinatie.
Atat la If cat si la WHILE se folosesc doi astfel de pointeri,numere, numiti: for_goto si for_jmp_false.
Exercitiu: Desenati cum arata bucatile de cod generate succesiv de compilator la fiecare instructiune si urmariti cum sunt folositi pointerii for_goto si for_jmp_false.
Urmeaza modificarile analizorului lexical, ca sa poata lucra cu acei intval si id, pe care i-ati declarat in zona %tokens.
Adaugati functia pentru afisarea codului. Cap 7, pg a 3-a de la sfarsit, paragraf : O functie pentru afisarea codului.
Construiti compilatorul conform indicatiilor din anexa 2 si compilati intai programul din Anexa 7. Trebuie sa va rezulte codul din anexa 7.
Portofoliul de la acest proiect: Pe linga predarea arhivei cu compilatorul obtinut compilati cu el TOATE programele scrise la Laboratorul 1, ambalati listele de coduri masina obtinute impreuna cu pachetul compilatorului, Se pot captura usor de pe ecranul terminalului cu SHIFT-CTRL-C dupa selectarea randurilor.
Faceti Paste intr-un editor.
Pentru pasii urmatori, aveti pagina noua pe blog.
Niciun comentariu:
Trimiteți un comentariu