



































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Compilatori algoritmi generazione di codice
Tipologia: Dispense
1 / 43
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!




































read x; /* input of integer */ if x > 0 then fact := 1; repeat fact := fact * x; x := x – 1 until x = 0; write fact endif
read x t1 = x> if_false t1 goto L fact = 1 label L t2 = fact * x fact = t t3 = x – 1 x = t t4 = x== if_false t4 goto L write fact label L halt
fact := fact * x t2^ = fact^ *^ x fact = t
(anche se sufficiente unica istruzione ® ottimizzazione)
read x t1 = x> if_false t1 goto L fact = 1 label L t2 = fact * x fact = t t3 = x – 1 x = t t4 = x== if_false t4 goto L write fact label L halt
(rd, x, , ) (gt, x, 0, t1) (if_f, t1, L1, ) (asn, 1, fact, ) (lab, L2, , ) (mul, fact, x, t2) (asn, t2, fact, ) (sub, x, 1 , t3) (asn, t3, x, ) (eq, x, 0, t4) (if_f, t4, L2, ) (wri, fact, , ) (lab, L1, , ) (halt, , , )
x := y + 1
lda x ; carica l'indirizzo di x lod y ; carica il valore di y ldc 1 ; carica la costante 1 adi ; somma sto ; memorizza la cima all'indirizzo sotto la cima e fa il pop di entrambi
lda x ; carica indirizzo di x rdi ; leggi l'intero, memorizzalo all'indirizzo sulla cima e fai il pop lod x ; carica valore di x ldc 0 ; carica la costante 0 grt ; confronta i due valori, rimuovili, push del risultato booleano fjp L1 ; pop del valore booleano, salta a L1 se falso lda fact ; carica indirizzo di fact ldc 1 ; carica la costante 1 sto ; pop due valori, memorizzando il primo all'indirizzo dato dal secondo lab L2 ; definizione della label L lda fact ; carica indirizzo di fact lod fact ; carica valore di fact lod x ; carica valore di x mpi ; moltiplicazione sto ; pop due valori, memorizzando il primo all'indirizzo dato dal secondo lda x ; carica indirizzo di x lod x ; carica valore di x ldc 1 ; carica la costante 1 sbi ; sottrazione sto ; pop due valori, memorizzando il primo all'indirizzo dato dal secondo lod x ; carica valore di x ldc 0 ; carica la costante 0 equ ; test di uguaglianza fjp L2 ; pop valore booleano, salta a L2 se falso lod fact ; carica valore di fact wri ; stampa top, pop lab L1 ; definizione della label L stp ; termina l'esecuzione
read x; /* input of integer */ if x > 0 then fact := 1; repeat fact := fact * x; x := x – 1 until x = 0; write fact endif
expr ® id = expr | term term ® term + factor | factor factor ® ( expr ) | num | id
Produzione Regole semantiche expr 1 ® id = expr 2 expr^1 .pcode = “lda” ||^ id .lexval^ ++^ expr^2 .pcode ++ “stn” expr ® term expr.^ pcode^ = term.^ pcode term 1 ® term 2 + factor term 1 .pcode = term 2 .pcode ++ factor .pcode ++ “adi” term ® factor term .pcode = factor .pcode factor ® ( expr ) factor .pcode = expr .pcode factor ® num factor .pcode = “ldc” || num. lexval factor ® id factor .pcode = “lod” || id. lexval
|| = concatenazione con spazio ++ = concatenazione con newline
(x = x + 3) + 4
expr
term
term factor
factor
( expr )
num 4
id x
=^ expr
term
term factor
factor (^) num 3 id x
Nodes P-code 10, 8 (^) lod x 9 ldc 3
7, 6
lod x ldc 3 adi
lda x lod x ldc 3 adi stn (^3) ldc 4
lda x lod x ldc 3 adi stn ldc 4 adi
(x = x + 3) + 4
expr
term
term factor
factor
( expr )
num 4
id x
=^ expr
term
term factor
factor (^) num 3 id x
Nodes qcode name 10,8 x 9 3 3 4 7, 6 t1^ =^ x +^3 t
5, 4, 2
t1 = x + 3 x = t1 t
t1 = x + 3 x = t t2 = t1 + 4
t
expr ® id = expr | term term ® term + factor | factor factor ® ( expr ) | num | id
typedef enum {PLUS, ASSIGN, NUM, ID} Symbol;
typedef struct t_node { Symbol symbol; struct t_node *p1, *p2; char lexeme; / for id , num */ } Node;
typedef Node *Pnode;
(x = x + 3) + 4
x= (^4)
x (^3)
(per albero astratto)
void genCode(Pnode p) { char code[MAXCODE]; /* massima lunghezza di una linea di Pcode */
switch (p>symbol) { case PLUS: genCode(p>p1); gencode(p>p2); emit("adi"); break ; case ASSIGN: sprintf(code, "lda %s", p>lexeme); emit(code); genCode(p>p1); emit("stn"); break ; case NUM: sprintf(code, "ldc %s", p>lexeme); emit(code); break ; case ID: sprintf(code, "lod %s", p>lexeme); emit(code); break ; } }
x= (^4)
x (^3)
top a^^ ind^ i top^ *(a + i)
a top i
ixa s (^) top a + (s * i)
int a[SIZE], i, j; … a[i+1] = a[j*2] + 3;