ErBestia
27-03-2006, 18:08
Salve a tutti! :D
Sto affrontando un corso di Linguaggi e Ambienti di programmazione, e trovo alcune difficoltà :muro: nella traduzione di codici in quadruple (o "codice a 3 indirizzi").
Ad esempio, davanti ad un esercizio del genere:
Scrivere il codice a quadruple (usando controllo di flusso per i booleani e metodo delle etichette per la generazione del codice) per il seguente frammento:
while (a > b) do
while (c < d) do begin
a := a/b;
c := c+1;
end
la soluzione potrebbe essere:
L1: if a > b goto L2
goto LNext
L2: if c < d goto L3
goto L1
L3: t1 := a/b
a := t1
t2 := c+1
c := t2
goto L2
LNext: ...
o bisogna aggiungere qualcos'altro per completare l'esercizio stesso?
Inoltre, volendo scrivere delle produzioni di un frammento di
grammatica che possa aver generato il codice precedente (produzioni + regole semantiche), mi chidedevo se si dovesse continuare così:
S --> while E do S1 { "codice while metodo etichette" }
S1 --> begin A end { S1.code := A.code}
S1 --> S { S1.code := S.code }
A --> id := B; A { NON SAPREI, MI POTETE AIUTARE? }
A --> id := B; { A.code := B.code ||
gen(id.place = B.place)}
B --> id1/id2 { B.place := newtemp;
B.code :=
gen(B.place := id1.place/id2.place)}
B --> id+1 { B.place := newtemp;
B.code :=
gen(B.place := id.place+1)}
E --> id1 relop id2 { E.code := gen(if id1.place relop.op
id2.place goto E.true) ||
gen(goto E.false) }
Ringrazio qualunque pio uomo x l'aiuto :help: , anche se capisco che la cosa può sembrare di non tanta rilevanza! :banned:
Ciauz ;)
Sto affrontando un corso di Linguaggi e Ambienti di programmazione, e trovo alcune difficoltà :muro: nella traduzione di codici in quadruple (o "codice a 3 indirizzi").
Ad esempio, davanti ad un esercizio del genere:
Scrivere il codice a quadruple (usando controllo di flusso per i booleani e metodo delle etichette per la generazione del codice) per il seguente frammento:
while (a > b) do
while (c < d) do begin
a := a/b;
c := c+1;
end
la soluzione potrebbe essere:
L1: if a > b goto L2
goto LNext
L2: if c < d goto L3
goto L1
L3: t1 := a/b
a := t1
t2 := c+1
c := t2
goto L2
LNext: ...
o bisogna aggiungere qualcos'altro per completare l'esercizio stesso?
Inoltre, volendo scrivere delle produzioni di un frammento di
grammatica che possa aver generato il codice precedente (produzioni + regole semantiche), mi chidedevo se si dovesse continuare così:
S --> while E do S1 { "codice while metodo etichette" }
S1 --> begin A end { S1.code := A.code}
S1 --> S { S1.code := S.code }
A --> id := B; A { NON SAPREI, MI POTETE AIUTARE? }
A --> id := B; { A.code := B.code ||
gen(id.place = B.place)}
B --> id1/id2 { B.place := newtemp;
B.code :=
gen(B.place := id1.place/id2.place)}
B --> id+1 { B.place := newtemp;
B.code :=
gen(B.place := id.place+1)}
E --> id1 relop id2 { E.code := gen(if id1.place relop.op
id2.place goto E.true) ||
gen(goto E.false) }
Ringrazio qualunque pio uomo x l'aiuto :help: , anche se capisco che la cosa può sembrare di non tanta rilevanza! :banned:
Ciauz ;)