Oppure

Loading
28/09/13 8:25
dmr
Ciao a tutti, sto studiando i compilatori dal libro "Compilatori Principi,tecniche e strumenti". Riscontro molti problemi durante l'implementazione di una grammatica LL-attribuita con le sue relative azioni semantiche,usando la tecnica di parsing LL(1).

Per esempio data la seguente grammatica(Le azioni semantiche sono tra {}):

T-> B { t=B.type; w=B.width; }
C { T.type=C.type; T.width=C.width; }

B-> int { B.type=integer; B.width=4; }

B-> float { B.type=float; B.width=8; }

C-> ε { C.type=t C.width=w; }

C-> [ num ] C1 { array(num.value,C1.type); C.width=num.value*C1.width }



Inizialmente sullo stack del parser ci sarà il record del non terminale T, quindi:

| T |
|type=? |
|width=? |
--------------

Ma il parser durante il suo lavoro andrà a sostituire il record di T con i record di Action(per eseguire le azioni semantiche) e quelli relativi ai non terminali B e C.
Quindi se il record di T sullo stack non c'è piu' come si fa ad eseguire le azioni semantiche del non terminale C ?
Dove sbaglio ?

Grazie a tutti !
Ultima modifica effettuata da dmr 28/09/13 8:40
aaa
29/09/13 1:16
pierotofy
Mm, non credo di aver capito la domanda... potresti formularla diversamente?
Il mio blog: piero.dev
29/09/13 6:50
dmr
Ok, ti faccio un esempio per farti capire meglio cosa intendo. Facciamo finta di implementare questa grammatica con le sue azioni semantiche:

S-> while ( {L1=new(); L2=new(); C.false=S.next(); C.true=L2; print("label",L1); }

C ) {S1.next=L1; print("label",L2);}

S1

All'inizio del parsing, ci sarà sullo stack il record di S che contiene appunto il non-terminale S con i suoi campi( che sarebbero gli attributi ereditati ). Quindi lo stack inizialmente è:

| S |
|next=x |
--------------

Con la seconda azione del parser, il parser espande S, rimuovendo il record di S dallo stack e mettendo i record di while ( C ) S1 . Quello che non riesco a capire è: se il parser deve cambiare il valore del campo next di S come deve fare se il record non è piu presente sullo stack? ( con la grammatica delle dichiarazioni ho questo problema ).

Ultima modifica effettuata da dmr 29/09/13 6:51
aaa
29/09/13 19:37
pierotofy
Penso la tua domanda sia piu' semplice da formulare in termini di: posso accedere ad un oggetto se non e' allocato nello stack?

La risposta e' si. Il fatto che lo stack (o qualsiasi altra struttura) contanga un *riferimento* ad un particolare oggetto non significa che nel momento in cui il riferimento viene eliminato l'oggetto non e' piu' accessibile. Basta che ci sia un'altro riferimento all'oggetto salvato da qualche altra parte.

Se non era questa la domanda, posso solo suggerire una piu' attenta lettura di come funziona LL parsing (anche da wikipedia). en.wikipedia.org/wiki/…
Il mio blog: piero.dev
02/10/13 13:20
dmr
Ok, grazie !!!
aaa